diff --git a/src/api/scm/couponPropertyPoolDetailApi.js b/src/api/scm/couponPropertyPoolDetailApi.js new file mode 100644 index 0000000..836ebb0 --- /dev/null +++ b/src/api/scm/couponPropertyPoolDetailApi.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' +import { getCommunityId } from '@/api/community/communityApi' + +// 获取优惠券赠送记录列表 +export function listCouponPropertyPoolDetail(params) { + return new Promise((resolve, reject) => { + const communityId = getCommunityId() + request({ + url: '/couponProperty.listCouponPropertyPoolDetail', + method: 'get', + params: { + ...params, + communityId + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 退回优惠券 +export function deleteCouponPropertyPoolDetail(data) { + return new Promise((resolve, reject) => { + const communityId = getCommunityId() + request({ + url: '/couponProperty.deleteCouponPropertyPoolDetail', + method: 'post', + data: { + ...data, + communityId + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/scm/couponPropertyUserDetailApi.js b/src/api/scm/couponPropertyUserDetailApi.js new file mode 100644 index 0000000..aa2bd5b --- /dev/null +++ b/src/api/scm/couponPropertyUserDetailApi.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +// 获取优惠券使用记录列表 +export function listCouponPropertyUserDetail(params) { + return new Promise((resolve, reject) => { + request({ + url: '/couponProperty.listCouponPropertyUserDetail', + method: 'get', + params + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 核销优惠券 +export function writeOffCouponPropertyUser(data) { + return new Promise((resolve, reject) => { + request({ + url: '/couponProperty.writeOffCouponPropertyUser', + method: 'post', + data + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/scm/couponPropertyUserManageApi.js b/src/api/scm/couponPropertyUserManageApi.js new file mode 100644 index 0000000..9f9e379 --- /dev/null +++ b/src/api/scm/couponPropertyUserManageApi.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +// 获取业主优惠券列表 +export function listCouponPropertyUser(params) { + return new Promise((resolve, reject) => { + request({ + url: '/couponProperty.listCouponPropertyUser', + method: 'get', + params + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/scm/integralConfigManageApi.js b/src/api/scm/integralConfigManageApi.js new file mode 100644 index 0000000..a39c7da --- /dev/null +++ b/src/api/scm/integralConfigManageApi.js @@ -0,0 +1,82 @@ +import request from '@/utils/request' +import { getCommunityId } from '@/api/community/communityApi' + +// 获取积分标准列表 +export function listIntegralConfig(params) { + return new Promise((resolve, reject) => { + const communityId = getCommunityId() + request({ + url: '/integral.listIntegralConfig', + method: 'get', + params: { + ...params, + communityId + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 添加积分标准 +export function saveIntegralConfig(data) { + return new Promise((resolve, reject) => { + const communityId = getCommunityId() + request({ + url: '/integral.saveIntegralConfig', + method: 'post', + data: { + ...data, + communityId + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 更新积分标准 +export function updateIntegralConfig(data) { + return new Promise((resolve, reject) => { + const communityId = getCommunityId() + request({ + url: '/integral.updateIntegralConfig', + method: 'post', + data: { + ...data, + communityId + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 删除积分标准 +export function deleteIntegralConfig(data) { + return new Promise((resolve, reject) => { + const communityId = getCommunityId() + request({ + url: '/integral.deleteIntegralConfig', + method: 'post', + data: { + ...data, + communityId + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/scm/integralGiftDetailManageApi.js b/src/api/scm/integralGiftDetailManageApi.js new file mode 100644 index 0000000..7f6cd36 --- /dev/null +++ b/src/api/scm/integralGiftDetailManageApi.js @@ -0,0 +1,61 @@ +import request from '@/utils/request' + +/** + * 查询积分赠送明细列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export function listIntegralGiftDetail(params) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.listIntegralGiftDetail', + method: 'get', + params + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +/** + * 添加积分赠送明细 + * @param {Object} data 添加数据 + * @returns {Promise} + */ +export function addIntegralGiftDetail(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.saveIntegralGiftDetail', + method: 'post', + data + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +/** + * 删除积分赠送明细 + * @param {String} detailId 明细ID + * @returns {Promise} + */ +export function deleteIntegralGiftDetail(detailId) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.deleteIntegralGiftDetail', + method: 'post', + data: { detailId } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/api/scm/integralRuleApi.js b/src/api/scm/integralRuleApi.js new file mode 100644 index 0000000..f25088c --- /dev/null +++ b/src/api/scm/integralRuleApi.js @@ -0,0 +1,222 @@ +import request from '@/utils/request' +import { getCommunityId } from '@/api/community/communityApi' + +// 积分规则相关API +export function listIntegralRule(params) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.listIntegralRule', + method: 'get', + params: { + ...params, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function saveIntegralRule(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.saveIntegralRule', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function updateIntegralRule(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.updateIntegralRule', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function deleteIntegralRule(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.deleteIntegralRule', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 积分标准配置相关API +export function listIntegralRuleConfig(params) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.listIntegralRuleConfig', + method: 'get', + params: { + ...params, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function saveIntegralRuleConfig(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.saveIntegralRuleConfig', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function deleteIntegralRuleConfig(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.deleteIntegralRuleConfig', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 积分标准池相关API +export function listIntegralConfig(params) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.listIntegralConfig', + method: 'get', + params: { + ...params, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 缴费时间相关API +export function listIntegralRuleFee(params) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.listIntegralRuleFee', + method: 'get', + params: { + ...params, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function saveIntegralRuleFee(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.saveIntegralRuleFee', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function updateIntegralRuleFee(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.updateIntegralRuleFee', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +export function deleteIntegralRuleFee(data) { + return new Promise((resolve, reject) => { + request({ + url: '/integral.deleteIntegralRuleFee', + method: 'post', + data: { + ...data, + communityId: getCommunityId() + } + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/components/scm/AddCouponRuleFee.vue b/src/components/scm/AddCouponRuleFee.vue index 3a974c4..592fe1b 100644 --- a/src/components/scm/AddCouponRuleFee.vue +++ b/src/components/scm/AddCouponRuleFee.vue @@ -1,64 +1,32 @@ @@ -33,9 +30,7 @@ import CouponRuleDiv from '@/components/scm/CouponRuleDiv' import CouponRuleCpps from '@/components/scm/CouponRuleCpps' import CouponRuleFees from '@/components/scm/CouponRuleFees' -import AddCouponRule from '@/components/scm/AddCouponRule' -import EditCouponRule from '@/components/scm/EditCouponRule' -import DeleteCouponRule from '@/components/scm/DeleteCouponRule' + export default { name: 'CouponRuleList', @@ -43,9 +38,7 @@ export default { CouponRuleDiv, CouponRuleCpps, CouponRuleFees, - AddCouponRule, - EditCouponRule, - DeleteCouponRule + }, data() { return { @@ -60,30 +53,18 @@ export default { methods: { handleSwitchCouponRule(rule) { this.currentCouponRule = rule + this.handleTabClick(this.activeTab) }, + handleTabClick(tab) { - this.activeTab = tab.name - }, - handleSuccess() { - this.$refs.couponRuleDiv.refreshList() + this.activeTab = tab + let _that = this; + setTimeout(function(){ + _that.$refs[tab].open(_that.currentCouponRule.ruleId) + },500) }, - openAddModal() { - this.$refs.addCouponRule.open() - }, - openEditModal() { - if (!this.currentCouponRule.ruleId) { - this.$message.warning(this.$t('couponRule.selectRuleFirst')) - return - } - this.$refs.editCouponRule.open(this.currentCouponRule) - }, - openDeleteModal() { - if (!this.currentCouponRule.ruleId) { - this.$message.warning(this.$t('couponRule.selectRuleFirst')) - return - } - this.$refs.deleteCouponRule.open(this.currentCouponRule) - } + + } } diff --git a/src/views/scm/integralConfigManageLang.js b/src/views/scm/integralConfigManageLang.js new file mode 100644 index 0000000..b857214 --- /dev/null +++ b/src/views/scm/integralConfigManageLang.js @@ -0,0 +1,142 @@ +export const messages = { + en: { + integralConfigManage: { + search: { + title: 'Search Conditions', + configNamePlaceholder: 'Please enter standard name' + }, + list: { + title: 'Points Standard' + }, + table: { + configName: 'Standard Name', + computingFormula: 'Calculation Formula', + squarePrice: 'Amount/Month', + additionalAmount: 'Points', + scale: 'Rounding' + }, + form: { + configName: 'Standard Name', + configNamePlaceholder: 'Required, please enter standard name', + computingFormula: 'Calculation Formula', + computingFormulaPlaceholder: 'Required, please select calculation formula', + amount: 'Amount', + amountPlaceholder: 'Required, please enter amount', + month: 'Month', + monthPlaceholder: 'Required, please enter month', + points: 'Points', + pointsPlaceholder: 'Required, please enter points', + scale: 'Rounding', + scalePlaceholder: 'Required, please select rounding' + }, + formula: { + fullAmount: 'Full amount give points', + fullMonth: 'Full month give points' + }, + scale: { + roundUp: 'Round up', + roundDown: 'Round down' + }, + validate: { + configIdRequired: 'Points standard cannot be empty', + configNameRequired: 'Standard name cannot be empty', + configNameMaxLength: 'Standard name cannot exceed 100 characters', + computingFormulaRequired: 'Calculation formula cannot be empty', + squarePriceRequired: 'Amount/month cannot be empty', + squarePriceMaxLength: 'Amount/month cannot exceed 12 characters', + additionalAmountRequired: 'Points cannot be empty', + additionalAmountMaxLength: 'Points cannot exceed 12 characters', + scaleRequired: 'Rounding cannot be empty' + }, + message: { + addSuccess: 'Add points standard successfully', + addFailed: 'Add points standard failed', + editSuccess: 'Edit points standard successfully', + editFailed: 'Edit points standard failed', + deleteSuccess: 'Delete points standard successfully', + deleteFailed: 'Delete points standard failed', + fetchError: 'Failed to get points standard data' + }, + add: { + title: 'Add Points Standard' + }, + edit: { + title: 'Edit Points Standard' + }, + delete: { + title: 'Delete Points Standard', + confirmMessage: 'Are you sure to delete this points standard?' + } + } + }, + zh: { + integralConfigManage: { + search: { + title: '查询条件', + configNamePlaceholder: '请输入标准名称' + }, + list: { + title: '积分标准' + }, + table: { + configName: '标准名称', + computingFormula: '计算公式', + squarePrice: '金额/月', + additionalAmount: '赠送积分', + scale: '进位' + }, + form: { + configName: '标准名称', + configNamePlaceholder: '必填,请填写标准名称', + computingFormula: '计算公式', + computingFormulaPlaceholder: '必填,请选择计算公式', + amount: '金额', + amountPlaceholder: '必填,请填写金额', + month: '月份', + monthPlaceholder: '必填,请填写月份', + points: '积分', + pointsPlaceholder: '必填,请填写积分', + scale: '进位', + scalePlaceholder: '必填,请选择进位' + }, + formula: { + fullAmount: '满(金额)送积分', + fullMonth: '满(月)送积分' + }, + scale: { + roundUp: '向上取整', + roundDown: '向下取整' + }, + validate: { + configIdRequired: '积分标准不能为空', + configNameRequired: '标准名称不能为空', + configNameMaxLength: '标准名称不能超过100个字符', + computingFormulaRequired: '计算公式不能为空', + squarePriceRequired: '金额/月不能为空', + squarePriceMaxLength: '金额/月不能超过12个字符', + additionalAmountRequired: '积分不能为空', + additionalAmountMaxLength: '积分不能超过12个字符', + scaleRequired: '进位不能为空' + }, + message: { + addSuccess: '添加积分标准成功', + addFailed: '添加积分标准失败', + editSuccess: '修改积分标准成功', + editFailed: '修改积分标准失败', + deleteSuccess: '删除积分标准成功', + deleteFailed: '删除积分标准失败', + fetchError: '获取积分标准数据失败' + }, + add: { + title: '添加积分标准' + }, + edit: { + title: '修改积分标准' + }, + delete: { + title: '删除积分标准', + confirmMessage: '确定删除该积分标准吗?' + } + } + } +} \ No newline at end of file diff --git a/src/views/scm/integralConfigManageList.vue b/src/views/scm/integralConfigManageList.vue new file mode 100644 index 0000000..8a52d04 --- /dev/null +++ b/src/views/scm/integralConfigManageList.vue @@ -0,0 +1,154 @@ + + + + + \ No newline at end of file diff --git a/src/views/scm/integralGiftDetailManageLang.js b/src/views/scm/integralGiftDetailManageLang.js new file mode 100644 index 0000000..904af72 --- /dev/null +++ b/src/views/scm/integralGiftDetailManageLang.js @@ -0,0 +1,50 @@ +export const messages = { + en: { + integralGiftDetailManage: { + search: { + title: 'Search Conditions', + detailId: 'Record ID', + userNameLike: 'User Name', + tel: 'Phone Number' + }, + list: { + title: 'Gift Records' + }, + table: { + detailId: 'Record ID', + acctName: 'Account Name', + configName: 'Standard Name', + ruleName: 'Rule Name', + quantity: 'Points Quantity', + userName: 'User Name', + tel: 'Phone Number', + createTime: 'Gift Time' + }, + fetchError: 'Failed to fetch gift records' + } + }, + zh: { + integralGiftDetailManage: { + search: { + title: '查询条件', + detailId: '记录编号', + userNameLike: '用户名称', + tel: '手机号' + }, + list: { + title: '赠送记录' + }, + table: { + detailId: '记录编号', + acctName: '账户名称', + configName: '标准名称', + ruleName: '规则名称', + quantity: '积分数量', + userName: '用户名称', + tel: '手机号', + createTime: '赠送时间' + }, + fetchError: '获取赠送记录失败' + } + } +} \ No newline at end of file diff --git a/src/views/scm/integralGiftDetailManageList.vue b/src/views/scm/integralGiftDetailManageList.vue new file mode 100644 index 0000000..61b0718 --- /dev/null +++ b/src/views/scm/integralGiftDetailManageList.vue @@ -0,0 +1,144 @@ + + + + + \ No newline at end of file diff --git a/src/views/scm/integralRuleLang.js b/src/views/scm/integralRuleLang.js new file mode 100644 index 0000000..7c837ea --- /dev/null +++ b/src/views/scm/integralRuleLang.js @@ -0,0 +1,108 @@ +export const messages = { + en: { + integralRule: { + addTitle: 'Add Integral Rule', + editTitle: 'Edit Integral Rule', + deleteTitle: 'Delete Integral Rule', + deleteConfirm: 'Are you sure to delete this integral rule?', + ruleName: 'Rule Name', + ruleNamePlaceholder: 'Please enter rule name', + ruleNameRequired: 'Rule name is required', + ruleNameMaxLength: 'Rule name cannot exceed 64 characters', + remark: 'Remark', + remarkPlaceholder: 'Please enter remark', + remarkRequired: 'Remark is required', + remarkMaxLength: 'Remark cannot exceed 512 characters', + ruleIdRequired: 'Rule ID is required', + selectRule: 'Please select a rule first', + + // Config related + addConfigTitle: 'Add Integral Config', + configId: 'Config ID', + configName: 'Config Name', + configPlaceholder: 'Please select config', + configRequired: 'Config is required', + deleteConfigConfirm: 'Are you sure to delete this config?', + computingFormula: 'Computing Formula', + squarePrice: 'Square Price', + additionalAmount: 'Additional Amount', + scale: 'Scale', + + // Fee related + addFeeTitle: 'Add Payment Time', + editFeeTitle: 'Edit Payment Time', + feeId: 'Fee ID', + payTimeRange: 'Payment Time Range', + payStartTime: 'Start Time', + payStartTimePlaceholder: 'Select start time', + payStartTimeRequired: 'Start time is required', + payEndTime: 'End Time', + payEndTimePlaceholder: 'Select end time', + payEndTimeRequired: 'End time is required', + payEndTimeAfterStart: 'End time must be after start time', + deleteFeeConfirm: 'Are you sure to delete this payment time?', + feeIdRequired: 'Fee ID is required', + + // Tab names + integralRuleConfig: 'Integral Standard', + integralRuleFee: 'Payment Time', + + // Messages + fetchError: 'Failed to fetch data', + selectRuleFirst: 'Please select a rule first' + } + }, + zh: { + integralRule: { + addTitle: '添加积分规则', + editTitle: '编辑积分规则', + deleteTitle: '删除积分规则', + deleteConfirm: '确定删除该积分规则吗?', + ruleName: '规则名称', + ruleNamePlaceholder: '请输入规则名称', + ruleNameRequired: '规则名称不能为空', + ruleNameMaxLength: '规则名称不能超过64个字符', + remark: '备注', + remarkPlaceholder: '请输入备注', + remarkRequired: '备注不能为空', + remarkMaxLength: '备注不能超过512个字符', + ruleIdRequired: '规则ID不能为空', + selectRule: '请先选择规则', + + // Config related + addConfigTitle: '添加积分标准', + configId: '配置ID', + configName: '配置名称', + configPlaceholder: '请选择配置', + configRequired: '配置不能为空', + deleteConfigConfirm: '确定删除该配置吗?', + computingFormula: '计算公式', + squarePrice: '单价', + additionalAmount: '固定积分', + scale: '进位', + + // Fee related + addFeeTitle: '添加缴费时间', + editFeeTitle: '编辑缴费时间', + feeId: '费用ID', + payTimeRange: '缴费时间范围', + payStartTime: '开始时间', + payStartTimePlaceholder: '选择开始时间', + payStartTimeRequired: '开始时间不能为空', + payEndTime: '结束时间', + payEndTimePlaceholder: '选择结束时间', + payEndTimeRequired: '结束时间不能为空', + payEndTimeAfterStart: '结束时间必须晚于开始时间', + deleteFeeConfirm: '确定删除该缴费时间吗?', + feeIdRequired: '费用ID不能为空', + + // Tab names + integralRuleConfig: '积分标准', + integralRuleFee: '缴费时间', + + // Messages + fetchError: '获取数据失败', + selectRuleFirst: '请先选择规则' + } + } +} \ No newline at end of file diff --git a/src/views/scm/integralRuleList.vue b/src/views/scm/integralRuleList.vue new file mode 100644 index 0000000..3ec592e --- /dev/null +++ b/src/views/scm/integralRuleList.vue @@ -0,0 +1,111 @@ + + + + + \ No newline at end of file