+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 删除
-
-
-
-
- 新增
+
+
+
+
+
+
+ 品项名称:
+ {{ px.pxmc || '未选择' }}
+
+
+ 单价:
+ ¥{{ px.pxjg || 0 }}
+
+
+ 已消费:
+ {{ px.yxf || 0 }}
+
+
+ 总购买:
+ {{ px.zgm || 1 }}
+
+
+ 剩余:
+ {{ (px.zgm || 1) - (px.yxf || 0) }}
+
+
+ 类型:
+ {{ px.ly || '购买' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 元
+
+
+
+
+
+ 元
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 元
+
+
+
+
+
+ 元
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前品项类型为"{{ px.qt2 }}",无需配置科技部老师业绩
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -157,6 +248,7 @@
import request from '@/utils/request'
import { getDictionaryDataSelector } from '@/api/systemData/dictionary'
import { previewDataInterface } from '@/api/systemData/dataInterface'
+ import { getInfo } from '@/api/user'
export default {
components: {},
props: [],
@@ -169,37 +261,123 @@
id:'',
id:undefined,
md:undefined,
- mcbh:undefined,
+ mdbh:undefined,
mdmc:undefined,
hy:undefined,
- hyxm:undefined,
+ hymc:undefined,
hyzh:undefined,
- jks:undefined,
- jkszh:undefined,
- jksxm:undefined,
+ tkje:undefined,
+ sgfy:undefined,
bz:undefined,
tkpx:undefined,
tksj:undefined,
tkr:undefined,
+ fileUrl:undefined,
+ lqHytkJksyjList:[],
+ lqHytkKjbsyjList:[],
lqHytkMxList:[],
},
rules: {
+ md: [
+ { required: true, message: '请选择门店', trigger: 'change' }
+ ],
+ hy: [
+ { required: true, message: '请选择会员', trigger: 'change' }
+ ]
},
mdOptions : [],
hyOptions : [],
pxOptions : [],
+ jksOptions:[],
+ kjbOptions:[],
}
},
computed: {},
watch: {},
created() {
- this.getmdOptions();
+ // 门店数据在loadStoreDataAndSetDefault中加载,避免重复
this.gethyOptions();
this.getpxOptions();
},
mounted() {
},
methods: {
+ // 门店选择变化处理
+ handleMdChange(val) {
+ const selectedMd = this.mdOptions.find(item => item.id === val);
+ if (selectedMd) {
+ this.dataForm.mdbh = selectedMd.mdbh || selectedMd.id;
+ this.dataForm.mdmc = selectedMd.fullName;
+ console.log('选择门店:', selectedMd);
+ } else {
+ this.dataForm.mdbh = '';
+ this.dataForm.mdmc = '';
+ }
+ },
+ // 会员选择变化处理
+ handleHyChange(val) {
+ const selectedHy = this.hyOptions.find(item => item.id === val);
+ if (selectedHy) {
+ this.dataForm.hyzh = selectedHy.hyzh || selectedHy.id;
+ this.dataForm.hymc = selectedHy.fullName;
+ console.log('选择会员:', selectedHy);
+
+ // 选择会员后,获取该会员的剩余品项
+ this.getpxOptions();
+ } else {
+ this.dataForm.hyzh = '';
+ this.dataForm.hymc = '';
+ this.pxOptions = []; // 清空品项选项
+ }
+ },
+ // 品项选择变化处理
+ handlePxChange(index, row) {
+ if (row.px) {
+ const selectedPx = this.pxOptions.find(item => item.id === row.px);
+ if (selectedPx) {
+ request({
+ url: `/api/Extend/LqXmzl/${selectedPx.id}`,
+ method: 'GET',
+ }).then((res) => {
+ let qt2 = res.data.qt2 || "";
+ let sgf = res.data.sgf || 0;
+ row.pxmc = selectedPx.fullName;
+ row.pxjg = selectedPx.ItemPrice || 0;
+ row.qt2 = qt2 || "";
+ row.yxf = selectedPx.ConsumedCount || 0; // 已消费
+ row.zgm = selectedPx.TotalPurchased || 1; // 总购买
+ row.ly = selectedPx.sourceType || "购买"; // 来源
+ row.projectNumber = 1; // 默认消费数量为1
+ row.sgf = sgf;
+
+ // 如果品项类型不是"科美",清空科技部老师列表
+ if (row.qt2 !== '科美') {
+ row.lqHytkKjbsyjList = [];
+ }
+
+ console.log('选择品项:', selectedPx.fullName, 'qt2:', selectedPx.qt2, '剩余数量:', selectedPx.RemainingCount);
+
+ // 重新计算总金额和总手工费
+ this.calculateTotalAmount();
+ this.calculateTotalLaborCost();
+ })
+ }
+ } else {
+ // 清空品项时,重置所有相关字段
+ row.pxmc = '';
+ row.pxjg = 0;
+ row.qt2 = '';
+ row.yxf = 0;
+ row.zgm = 1;
+ row.ly = '购买';
+ row.projectNumber = 1;
+ row.lqHytkKjbsyjList = []; // 清空科技部老师列表
+
+ // 重新计算总金额和总手工费
+ this.calculateTotalAmount();
+ this.calculateTotalLaborCost();
+ }
+ },
getmdOptions(){
previewDataInterface('730960205902251269').then(res => {
this.mdOptions = res.data
@@ -210,11 +388,237 @@
this.hyOptions = res.data
});
},
- getpxOptions(){
- previewDataInterface('730971133356016901').then(res => {
- this.pxOptions = res.data
+ // 获取品项选项(从会员剩余品项API获取)
+ async getpxOptions() {
+ if (!this.dataForm.hy) {
+ console.warn("请先选择会员");
+ this.pxOptions = [];
+ return;
+ }
+
+ try {
+ const response = await request({
+ url: `/api/Extend/lqkhxx/GetMemberRemainingItems?memberId=${this.dataForm.hy}`,
+ method: 'GET',
+ });
+
+ if (response.code == 200 && response.data && response.data.RemainingItems) {
+ this.pxOptions = response.data.RemainingItems.map(item => ({
+ fullName: item.ItemName,
+ id: item.ItemId,
+ value: item.ItemId,
+ label: item.ItemName,
+ px: item.ItemId,
+ pxmc: item.ItemName,
+ pxjg: item.ItemPrice || 0,
+ qt2: item.qt2 || "",
+ RemainingCount: item.RemainingCount || 0,
+ ItemPrice: item.ItemPrice || 0,
+ sgf: 0,
+ sourceType: item.SourceType || "购买",
+ TotalPurchased: item.TotalPurchased || 0,
+ ConsumedCount: item.ConsumedCount || 0
+ }));
+ console.log('获取会员剩余品项成功:', this.pxOptions);
+ } else {
+ console.warn("获取会员剩余品项失败,使用默认数据");
+ this.pxOptions = [];
+ }
+ } catch (error) {
+ console.error("获取会员剩余品项出错:", error);
+ this.pxOptions = [];
+ }
+ },
+ // 获取健康师选项
+ getjksOptions() {
+ request({
+ url: `/api/Extend/user?page=1&pageSize=1000&mdid=${this.dataForm.md}&gw=健康师`,
+ method: 'GET',
+ }).then((res) => {
+ if (res.code == 200 && res.data.list.length > 0) {
+ this.jksOptions = res.data.list.map(item => ({
+ fullName: item.realName || item.name || item.userName,
+ id: item.id,
+ value: item.id,
+ label: item.realName || item.name || item.userName,
+ jks: item.id,
+ jksxm: item.realName || item.name || item.userName,
+ jkszh: item.mobilePhone || item.account || item.userName
+ }));
+ } else {
+ this.jksOptions = [];
+ }
+ })
+ },
+ // 获取科技部老师选项
+ async getkjbOptions() {
+ await this.getKjbOptionsByOrganizeId();
+ },
+ // 根据门店ID获取科技部组织ID,再获取科技部老师列表
+ async getKjbOptionsByOrganizeId() {
+ try {
+ // 1. 先获取门店信息,获取科技部组织ID
+ const storeResponse = await request({
+ url: `/api/Extend/LqMdxx/${this.dataForm.md}`,
+ method: 'GET',
+ });
+
+ let organizeId = "";
+ if (storeResponse.code == 200 && storeResponse.data) {
+ organizeId = storeResponse.data.kjb || "";
+ console.log('获取到科技部组织ID:', organizeId);
+ }
+
+ if (!organizeId) {
+ console.warn('未获取到科技部组织ID');
+ this.kjbOptions = [];
+ return;
+ }
+
+ // 2. 根据科技部组织ID获取科技部老师列表
+ const userResponse = await request({
+ url: `/api/Extend/user?page=1&pageSize=1000&organizeId=${organizeId}&gw=科技老师`,
+ method: 'GET',
+ });
+
+ if (userResponse.code == 200 && userResponse.data && userResponse.data.list.length > 0) {
+ this.kjbOptions = userResponse.data.list.map(item => ({
+ fullName: item.realName || item.name || item.userName,
+ id: item.id,
+ value: item.id,
+ label: item.realName || item.name || item.userName,
+ kjbls: item.id,
+ kjblsxm: item.realName || item.name || item.userName,
+ kjblszh: item.mobilePhone || item.account || item.userName
+ }));
+ console.log('科技部老师列表:', this.kjbOptions);
+ } else {
+ console.warn('获取科技部老师列表失败');
+ this.kjbOptions = [];
+ }
+ } catch (error) {
+ console.error('获取科技部老师列表出错:', error);
+ this.kjbOptions = [];
+ }
+ },
+ // 品项健康师选择
+ handleJksChange(pxIndex, jksIndex, row) {
+ console.log('品项健康师选择:', row);
+ if (row.jks) {
+ // 根据选择的健康师ID获取用户信息
+ const selectedJks = this.jksOptions.find(item => item.id === row.jks);
+ if (selectedJks) {
+ // 填充姓名和账号
+ row.jksxm = selectedJks.fullName;
+ row.jkszh = selectedJks.userName || selectedJks.account || selectedJks.id;
+
+ // 获取金三角信息
+ this.getJsjInfoByUserId(row.jks, (jsjId, jsjName) => {
+ row.jsjName = jsjName;
+ row.jsjId = jsjId;
+ });
+ }
+ } else {
+ // 清空相关字段
+ row.jksxm = '';
+ row.jkszh = '';
+ row.jsjId = '';
+ }
+ },
+ // 品项科技部老师选择
+ handleKjbChange(pxIndex, kjbIndex, row) {
+ console.log('品项科技部老师选择:', row);
+ if (row.kjbls) {
+ // 根据选择的科技部老师ID获取用户信息
+ const selectedKjb = this.kjbOptions.find(item => item.id === row.kjbls);
+ if (selectedKjb) {
+ // 填充姓名和账号
+ row.kjblsxm = selectedKjb.fullName;
+ row.kjblszh = selectedKjb.userName || selectedKjb.account || selectedKjb.id;
+ }
+ } else {
+ // 清空相关字段
+ row.kjblsxm = '';
+ row.kjblszh = '';
+ }
+ },
+ // 根据用户ID获取金三角信息
+ getJsjInfoByUserId(userId, callback) {
+ request({
+ url: `/api/Extend/lqycsdjsj/Actions/GetThisMonthJsjInfo?userId=${userId}`,
+ method: 'GET',
+ }).then((res) => {
+ if (res.code === 200 && res.data) {
+ // 假设返回的数据结构中有jsj_id字段
+ const jsjId = res.data.jsjId;
+ const jsjName = res.data.jsjName;
+
+ if (callback) {
+ callback(jsjId, jsjName);
+ }
+ console.log('获取金三角信息成功:', res.data);
+ } else {
+ console.warn('获取金三角信息失败:', res.msg);
+ if (callback) {
+ callback('');
+ }
+ }
+ }).catch((err) => {
+ console.error('获取金三角信息出错:', err);
+ if (callback) {
+ callback('');
+ }
});
},
+ // 品项内人员业绩数字格式化
+ formatPxStaffNumber(pxIndex, staffIndex, field, listName) {
+ const targetList = this.dataForm.lqHytkMxList[pxIndex][listName];
+ if (targetList && targetList[staffIndex] && targetList[staffIndex][field] !== undefined) {
+ let value = targetList[staffIndex][field].toString().replace(/,/g, '');
+
+ if (!/^\d*\.?\d*$/.test(value)) {
+ value = value.replace(/[^\d.]/g, '');
+ }
+
+ targetList[staffIndex][field] = value;
+ }
+ },
+ // 获取品项剩余数量
+ getRemainingCount(px) {
+ if (px.px) {
+ const selectedPx = this.pxOptions.find(item => item.id === px.px);
+ if (selectedPx) {
+ return selectedPx.RemainingCount || 0;
+ }
+ }
+ return (px.zgm || 1) - (px.yxf || 0);
+ },
+ // 消费数量变化处理
+ onProjectNumberChange() {
+ // 重新计算总金额和总手工费
+ this.calculateTotalAmount();
+ this.calculateTotalLaborCost();
+ },
+ // 计算总退款金额
+ calculateTotalAmount() {
+ let totalAmount = 0;
+ this.dataForm.lqHytkMxList.forEach(px => {
+ if (px.px && px.pxjg && px.projectNumber) {
+ totalAmount += parseFloat(px.pxjg) * parseInt(px.projectNumber);
+ }
+ });
+ this.dataForm.tkje = totalAmount.toFixed(2);
+ },
+ // 计算总手工费
+ calculateTotalLaborCost() {
+ let totalLaborCost = 0;
+ this.dataForm.lqHytkMxList.forEach(px => {
+ if (px.sgf && px.projectNumber) {
+ totalLaborCost += parseFloat(px.sgf) * parseInt(px.projectNumber);
+ }
+ });
+ this.dataForm.sgfy = totalLaborCost.toFixed(2);
+ },
goBack() {
this.$emit('refresh')
},
@@ -230,13 +634,35 @@
method: 'get'
}).then(res =>{
this.dataForm = res.data;
+ this.dataForm.fileUrl = this.dataForm.fileUrl?JSON.parse(this.dataForm.fileUrl):[];
})
+ } else {
+ // 新建时自动设置当前用户门店
+ this.loadStoreDataAndSetDefault();
+ // 加载健康师和科技部老师选项
+ this.getjksOptions();
+ this.getkjbOptions();
+ // 初始化时计算总金额和总手工费
+ this.calculateTotalAmount();
+ this.calculateTotalLaborCost();
}
})
},
dataFormSubmit() {
+
this.$refs['elForm'].validate((valid) => {
if (valid) {
+ // 验证品项数据
+ if (!this.validatePxList()) {
+ return;
+ }
+
+ // 处理提交格式
+ this.processFormData();
+ console.log(this.dataForm)
+ // return
+
+ this.dataForm.fileUrl = JSON.stringify(this.dataForm.fileUrl);
if (!this.dataForm.id) {
request({
url: `/api/Extend/LqHytkHytk`,
@@ -273,22 +699,623 @@
}
})
},
- addHandleLqHytkMxEntityList() {
+ // 品项相关方法
+ addHandleLqXhPxmxEntityList() {
let item = {
- id:undefined,
- gltkbh:undefined,
- px:undefined,
- mc:undefined,
- tkje:undefined,
- cs:undefined,
- dchk:undefined,
- fssj:undefined,
+ id: undefined,
+ glkdbh: undefined,
+ px: undefined,
+ pxmc: undefined,
+ pxjg: undefined,
+ xfzs: undefined,
+ yxf: 0, // 已消费
+ zgm: 1, // 总购买
+ ly: '购买', // 来源
+ projectNumber: 1, // 消费数量
+ qt2: undefined, // 品项类型
+ lqHytkJksyjList: [], // 健康师业绩列表
+ lqHytkKjbsyjList: [], // 科技部老师业绩列表
}
- this.dataForm.lqHytkMxList.push(item)
+ this.dataForm.lqHytkMxList.push(item);
+ // 重新计算总金额和总手工费
+ this.calculateTotalAmount();
+ this.calculateTotalLaborCost();
},
- handleDelLqHytkMxEntityList(index) {
+ handleDelLqXhPxmxEntityList(index) {
this.dataForm.lqHytkMxList.splice(index, 1);
+ // 重新计算总金额和总手工费
+ this.calculateTotalAmount();
+ this.calculateTotalLaborCost();
+ },
+ validatePxList(){
+ const pxList = this.dataForm.lqHytkMxList;
+
+ // 1. 验证是否有品项
+ if (!pxList || pxList.length === 0) {
+ this.$message.error('请至少添加一个品项');
+ return false;
+ }
+
+ // 2. 验证每个品项的信息
+ for (let i = 0; i < pxList.length; i++) {
+ const px = pxList[i];
+
+ // 验证品项基本信息
+ if (!px.px || !px.pxmc) {
+ this.$message.error(`第${i + 1}个品项信息不完整,请重新选择`);
+ return false;
+ }
+ if (!px.pxjg || parseFloat(px.pxjg) <= 0) {
+ this.$message.error(`第${i + 1}个品项的价格必须大于0`);
+ return false;
+ }
+
+ // 验证退卡次数不能超过剩余次数
+ if (px.RemainingCount && px.projectNumber > px.RemainingCount) {
+ this.$message.error(`第${i + 1}个品项的退卡次数(${px.projectNumber})不能超过剩余次数(${px.RemainingCount})`);
+ return false;
+ }
+
+ // 验证健康师
+ if (!px.lqHytkJksyjList || px.lqHytkJksyjList.length === 0) {
+ this.$message.error(`第${i + 1}个品项必须至少选择一个健康师`);
+ return false;
+ }
+
+ // 计算健康师业绩总和
+ let jksTotalYj = 0;
+ let jksTotalLaborCost = 0;
+ let jksTotalNumber = 0;
+
+ for (let j = 0; j < px.lqHytkJksyjList.length; j++) {
+ const jks = px.lqHytkJksyjList[j];
+
+ // 验证健康师是否选择
+ if (!jks.jks || !jks.jksxm) {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师必须选择`);
+ return false;
+ }
+
+ // 验证健康师业绩必须填写
+ if (!jks.jksyj || jks.jksyj.trim() === "") {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师业绩必须填写`);
+ return false;
+ }
+
+ // 验证业绩为数字
+ const yj = parseFloat(jks.jksyj);
+ if (isNaN(yj) || yj < 0) {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师业绩必须为有效数字`);
+ return false;
+ }
+
+ jksTotalYj += yj;
+ jksTotalLaborCost += parseFloat(jks.laborCost) || 0;
+ jksTotalNumber += parseInt(jks.kdpxNumber) || 0;
+ }
+
+ // 验证健康师业绩总和等于品项金额
+ const pxTotalAmount = px.pxjg * px.projectNumber;
+ if (Math.abs(jksTotalYj - pxTotalAmount) > 0.01) {
+ this.$message.error(`第${i + 1}个品项的健康师业绩总和(${jksTotalYj.toFixed(2)})必须等于品项金额(${pxTotalAmount.toFixed(2)})`);
+ return false;
+ }
+
+ // 验证健康师手工费总和等于品项手工费
+ const pxTotalLaborCost = (px.sgf || 0) * px.projectNumber;
+ if (Math.abs(jksTotalLaborCost - pxTotalLaborCost) > 0.01) {
+ this.$message.error(`第${i + 1}个品项的健康师手工费总和(${jksTotalLaborCost.toFixed(2)})必须等于品项手工费(${pxTotalLaborCost.toFixed(2)})`);
+ return false;
+ }
+
+ // 验证健康师次数总和等于品项次数
+ if (jksTotalNumber !== px.projectNumber) {
+ this.$message.error(`第${i + 1}个品项的健康师次数总和(${jksTotalNumber})必须等于品项次数(${px.projectNumber})`);
+ return false;
+ }
+
+ // 如果是科美品项,验证科技部老师
+ if (px.qt2 === '科美') {
+ if (!px.lqHytkKjbsyjList || px.lqHytkKjbsyjList.length === 0) {
+ this.$message.error(`第${i + 1}个品项是科美品项,必须至少选择一个科技部老师`);
+ return false;
+ }
+
+ // 计算科技部老师业绩总和
+ let kjbTotalYj = 0;
+ let kjbTotalLaborCost = 0;
+ let kjbTotalNumber = 0;
+
+ for (let k = 0; k < px.lqHytkKjbsyjList.length; k++) {
+ const kjb = px.lqHytkKjbsyjList[k];
+
+ // 验证科技部老师是否选择
+ if (!kjb.kjbls || !kjb.kjblsxm) {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师必须选择`);
+ return false;
+ }
+
+ // 验证科技部老师业绩必须填写
+ if (!kjb.kjblsyj || kjb.kjblsyj.trim() === "") {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师业绩必须填写`);
+ return false;
+ }
+
+ // 验证业绩为数字
+ const yj = parseFloat(kjb.kjblsyj);
+ if (isNaN(yj) || yj < 0) {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师业绩必须为有效数字`);
+ return false;
+ }
+
+ kjbTotalYj += yj;
+ kjbTotalLaborCost += parseFloat(kjb.laborCost) || 0;
+ kjbTotalNumber += parseInt(kjb.hdpxNumber) || 0;
+ }
+
+ // 验证科技部老师业绩总和等于品项金额
+ if (Math.abs(kjbTotalYj - pxTotalAmount) > 0.01) {
+ this.$message.error(`第${i + 1}个品项的科技部老师业绩总和(${kjbTotalYj.toFixed(2)})必须等于品项金额(${pxTotalAmount.toFixed(2)})`);
+ return false;
+ }
+
+ // 验证科技部老师手工费总和等于品项手工费
+ if (Math.abs(kjbTotalLaborCost - pxTotalLaborCost) > 0.01) {
+ this.$message.error(`第${i + 1}个品项的科技部老师手工费总和(${kjbTotalLaborCost.toFixed(2)})必须等于品项手工费(${pxTotalLaborCost.toFixed(2)})`);
+ return false;
+ }
+
+ // 验证科技部老师次数总和等于品项次数
+ if (kjbTotalNumber !== px.projectNumber) {
+ this.$message.error(`第${i + 1}个品项的科技部老师次数总和(${kjbTotalNumber})必须等于品项次数(${px.projectNumber})`);
+ return false;
+ }
+ }
+ }
+
+ return true;
+ },
+ // 处理表单数据
+ processFormData() {
+ // 检查是否有科美品项
+ const hasKemei = this.dataForm.lqHytkMxList.some(px => px.qt2 === '科美');
+
+ // 设置是否有科技部
+ this.dataForm.sfykjb = hasKemei ? "是" : "否";
+
+ // 处理品项列表,转换为指定格式
+ this.dataForm.lqHytkMxList = this.dataForm.lqHytkMxList.map(px => {
+ // 计算退卡金额和总价
+ const tkje = parseFloat(px.pxjg) * parseInt(px.projectNumber) || 0;
+ const f_TotalPrice = tkje;
+
+ // 处理健康师列表
+ const lqHytkJksyjList = (px.lqHytkJksyjList || []).map(jks => ({
+ jks: jks.jks || '',
+ jksxm: jks.jksxm || '',
+ jkszh: jks.jkszh || '',
+ jksyj: parseFloat(jks.jksyj) || 0,
+ f_jsjid: jks.jsjId || '',
+ f_tkpxid: px.px || '',
+ f_LaborCost: parseFloat(jks.laborCost) || 0,
+ f_tkpxNumber: parseInt(px.projectNumber) || 0
+ }));
+
+ // 处理科技部老师列表
+ const lqHytkKjbsyjList = (px.lqHytkKjbsyjList || []).map(kjb => ({
+ kjbls: kjb.kjbls || '',
+ kjblsxm: kjb.kjblsxm || '',
+ kjblszh: kjb.kjblszh || '',
+ kjblsyj: parseFloat(kjb.kjblsyj) || 0,
+ f_tkpxid: px.px || '',
+ f_LaborCost: parseFloat(kjb.laborCost) || 0,
+ f_tkpxNumber: parseInt(px.projectNumber) || 0
+ }));
+
+ return {
+ px: px.px || '',
+ pxmc: px.pxmc || '',
+ pxjg: parseFloat(px.pxjg) || 0,
+ tkje: tkje,
+ f_ProjectNumber: parseInt(px.projectNumber) || 0,
+ f_SourceType: px.qt2 || '',
+ f_TotalPrice: f_TotalPrice,
+ lqHytkJksyjList: lqHytkJksyjList,
+ lqHytkKjbsyjList: lqHytkKjbsyjList
+ };
+ });
+ },
+ // 品项健康师相关方法
+ addPxJks(pxIndex) {
+ if (!this.dataForm.lqHytkMxList[pxIndex].lqHytkJksyjList) {
+ this.$set(this.dataForm.lqHytkMxList[pxIndex], 'lqHytkJksyjList', []);
+ }
+ let item = {
+ "jks": "",
+ "jksxm": "",
+ "jkszh": "",
+ "jksyj": "",
+ "jsjId": "",
+ "laborCost": 1,
+ "kdpxNumber": 0
+ }
+ this.dataForm.lqHytkMxList[pxIndex].lqHytkJksyjList.push(item);
+ },
+ removePxJks(pxIndex, jksIndex) {
+ this.dataForm.lqHytkMxList[pxIndex].lqHytkJksyjList.splice(jksIndex, 1);
+ },
+ // 品项科技部老师相关方法
+ addPxKjb(pxIndex) {
+ if (!this.dataForm.lqHytkMxList[pxIndex].lqHytkKjbsyjList) {
+ this.$set(this.dataForm.lqHytkMxList[pxIndex], 'lqHytkKjbsyjList', []);
+ }
+ let item = {
+ "kjbls": "",
+ "kjblsyj": "",
+ "kjblsxm": "",
+ "kjblszh": "",
+ "laborCost": 0,
+ "hdpxNumber": 0
+ }
+ this.dataForm.lqHytkMxList[pxIndex].lqHytkKjbsyjList.push(item);
+ },
+ removePxKjb(pxIndex, kjbIndex) {
+ this.dataForm.lqHytkMxList[pxIndex].lqHytkKjbsyjList.splice(kjbIndex, 1);
+ },
+ // 加载门店数据并设置默认门店
+ loadStoreDataAndSetDefault() {
+ console.log('开始加载门店数据和用户信息...');
+ // 先加载门店数据
+ this.loadStoreDataPromise().then(() => {
+ // 门店数据加载完成后,获取用户信息
+ return this.getCurrentUserStorePromise();
+ }).then((userData) => {
+ if (userData && userData.mdid) {
+ const userStoreId = userData.mdid;
+ console.log('用户门店ID:', userStoreId);
+ console.log('门店选项列表:', this.mdOptions);
+
+ // 检查用户门店ID是否在门店列表中
+ const matchingStore = this.mdOptions.find(store => store.id === userStoreId);
+ if (matchingStore) {
+ this.dataForm.md = userStoreId;
+ this.dataForm.mdmc = matchingStore.fullName;
+ this.dataForm.mdbh = matchingStore.id;
+ console.log('找到匹配的门店,设置默认门店ID:', userStoreId);
+ console.log('匹配的门店信息:', matchingStore);
+ } else {
+ console.warn('用户门店ID在门店列表中未找到匹配项');
+ console.log('用户门店ID:', userStoreId);
+ console.log('可用门店ID列表:', this.mdOptions.map(s => s.id));
+ }
+ } else {
+ console.warn('用户数据中没有门店ID,无法设置默认值');
+ }
+
+ // 加载健康师和科技部老师选项
+ this.getjksOptions();
+ this.getkjbOptions();
+ }).catch(err => {
+ console.error('加载数据失败:', err);
+ });
+ },
+ // 加载门店数据
+ loadStoreDataPromise() {
+ // 使用原来的数据接口方式
+ return previewDataInterface('730960205902251269').then(res => {
+ console.log('门店API原始响应:', res);
+ if (res.data && res.data.length > 0) {
+ this.mdOptions = res.data;
+ console.log('门店数据加载成功:', this.mdOptions);
+ return res.data;
+ } else {
+ console.warn('门店数据为空');
+ return [];
+ }
+ }).catch(err => {
+ console.error('门店数据加载失败:', err);
+ return [];
+ });
+ },
+ // 获取当前用户门店信息
+ getCurrentUserStorePromise() {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ resolve(res.data.userInfo);
+ }).catch(err => {
+ console.error('获取当前用户信息失败:', err);
+ reject(err);
+ });
+ });
},
}
}
+
+
diff --git a/antis-ncc-admin/src/views/lqKdKdjlb/Form.vue b/antis-ncc-admin/src/views/lqKdKdjlb/Form.vue
index 5fb482f..76b7343 100644
--- a/antis-ncc-admin/src/views/lqKdKdjlb/Form.vue
+++ b/antis-ncc-admin/src/views/lqKdKdjlb/Form.vue
@@ -498,6 +498,50 @@ export default {
this.$message.error(`第${i + 1}个品项请至少添加一个健康师业绩`);
return false;
}
+
+ // 验证每个健康师是否选择
+ for (let j = 0; j < px.lqKdJksyjList.length; j++) {
+ const jks = px.lqKdJksyjList[j];
+ if (!jks.jks || !jks.jksxm) {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师必须选择`);
+ return false;
+ }
+ if (!jks.jksyj || jks.jksyj.trim() === "") {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师业绩必须填写`);
+ return false;
+ }
+ const yj = parseFloat(jks.jksyj);
+ if (isNaN(yj) || yj < 0) {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师业绩必须为有效数字`);
+ return false;
+ }
+ }
+
+ // 如果是科美品项,验证科技部老师
+ if (px.qt2 === '科美') {
+ if (!px.lqKdKjbsyjList || px.lqKdKjbsyjList.length === 0) {
+ this.$message.error(`第${i + 1}个品项是科美品项,必须至少选择一个科技部老师`);
+ return false;
+ }
+
+ // 验证每个科技部老师是否选择
+ for (let k = 0; k < px.lqKdKjbsyjList.length; k++) {
+ const kjb = px.lqKdKjbsyjList[k];
+ if (!kjb.kjbls || !kjb.kjblsxm) {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师必须选择`);
+ return false;
+ }
+ if (!kjb.kjblsyj || kjb.kjblsyj.trim() === "") {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师业绩必须填写`);
+ return false;
+ }
+ const yj = parseFloat(kjb.kjblsyj);
+ if (isNaN(yj) || yj < 0) {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师业绩必须为有效数字`);
+ return false;
+ }
+ }
+ }
}
// 3. 验证每个品项金额等于该品项健康师业绩之和
@@ -697,7 +741,7 @@ export default {
this.$nextTick(() => {
this.initPxQt2Fields();
});
- this.dataForm.f_FileUrl = JSON.parse(this.dataForm.f_FileUrl);
+ this.dataForm.f_FileUrl = this.dataForm.F_FIleUrl?JSON.parse(this.dataForm.F_FIleUrl):[];
})
} else {
// 新增时先加载门店数据,再获取用户门店
diff --git a/antis-ncc-admin/src/views/lqXhHyhk/Form.vue b/antis-ncc-admin/src/views/lqXhHyhk/Form.vue
index f3e6857..a6754f2 100644
--- a/antis-ncc-admin/src/views/lqXhHyhk/Form.vue
+++ b/antis-ncc-admin/src/views/lqXhHyhk/Form.vue
@@ -9,7 +9,7 @@
-
+
@@ -30,7 +30,7 @@
-
+
@@ -57,14 +57,14 @@
-
+
元
-
+
元
@@ -941,6 +941,12 @@
for (let j = 0; j < px.lqXhJksyjList.length; j++) {
const jks = px.lqXhJksyjList[j];
+ // 验证健康师是否选择
+ if (!jks.jks || !jks.jksxm) {
+ this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师必须选择`);
+ return false;
+ }
+
// 验证健康师业绩必须填写
if (!jks.jksyj || jks.jksyj.trim() === "") {
this.$message.error(`第${i + 1}个品项的第${j + 1}个健康师业绩必须填写`);
@@ -994,6 +1000,12 @@
for (let k = 0; k < px.lqXhKjbsyjList.length; k++) {
const kjb = px.lqXhKjbsyjList[k];
+ // 验证科技部老师是否选择
+ if (!kjb.kjbls || !kjb.kjblsxm) {
+ this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师必须选择`);
+ return false;
+ }
+
// 验证科技部老师业绩必须填写
if (!kjb.kjblsyj || kjb.kjblsyj.trim() === "") {
this.$message.error(`第${i + 1}个品项的第${k + 1}个科技部老师业绩必须填写`);
diff --git a/antis-ncc-admin/src/views/lqXhHyhk/index.vue b/antis-ncc-admin/src/views/lqXhHyhk/index.vue
index bf3b8e4..1f4bc77 100644
--- a/antis-ncc-admin/src/views/lqXhHyhk/index.vue
+++ b/antis-ncc-admin/src/views/lqXhHyhk/index.vue
@@ -126,7 +126,7 @@
- 编辑
+ 查看
删除