src/views/productionManagement/productionReporting/components/formDia.vue
@@ -4,83 +4,100 @@
        v-model="dialogFormVisible"
        title="生产报工"
        width="70%"
            draggable
        @close="closeDia"
    >
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="排产数量:" prop="schedulingNum">
              <el-input v-model="form.schedulingNum" placeholder="请输入" clearable disabled/>
            </el-form-item>
          </el-col>
               <el-col :span="12">
                  <el-form-item label="待生产数量:" prop="pendingNum">
                     <el-input v-model="form.pendingNum" placeholder="请输入" clearable disabled/>
                  </el-form-item>
               </el-col>
        </el-row>
        <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="本次生产数量:" prop="finishedNum">
                     <el-input-number
                        v-model="form.finishedNum"
                        placeholder="请输入"
                        :min="0"
                        :step="0.1"
                        :precision="2"
                        clearable
                        style="width: 100%"
                        @change="changeNum"
                     />
                  </el-form-item>
               </el-col>
          <el-col :span="12">
            <el-form-item label="单价(元):" prop="unitPrice">
              <el-input v-model="form.unitPrice" placeholder="请输入" clearable @input="calculateTotalPrice"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="总价(元):" prop="totalPrice">
              <el-input v-model="form.totalPrice" placeholder="请输入" clearable disabled/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
               <el-col :span="12">
                  <el-form-item label="生产人:" prop="schedulingUserId">
                     <el-select
                        v-model="form.schedulingUserId"
                        placeholder="选择人员"
                        style="width: 100%;"
      <el-form label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-table
          :data="reportList"
          border
          style="width: 100%"
        >
          <el-table-column
            align="center"
            label="序号"
            type="index"
            width="60"
          />
          <el-table-column label="合同号" prop="salesContractNo" width="150" />
          <el-table-column label="产品大类" prop="productCategory" width="120" />
          <el-table-column label="规格型号" prop="specificationModel" width="150" />
          <el-table-column label="排产数量" prop="schedulingNum" width="100">
            <template #default="scope">
              <span>{{ scope.row.schedulingNum }}</span>
            </template>
          </el-table-column>
          <el-table-column label="待生产数量" prop="pendingNum" width="100">
            <template #default="scope">
              <span>{{ scope.row.pendingNum }}</span>
            </template>
          </el-table-column>
          <el-table-column label="本次生产数量" prop="finishedNum" width="150">
            <template #default="scope">
              <el-input-number
                v-model="scope.row.finishedNum"
                placeholder="请输入"
                :min="0"
                :step="0.1"
                :precision="2"
                clearable
                style="width: 100%"
                @change="(val) => changeNum(scope.row, val)"
              />
            </template>
          </el-table-column>
          <el-table-column label="单价(元)" prop="unitPrice" width="120">
            <template #default="scope">
              <el-input-number
                v-model="scope.row.unitPrice"
                placeholder="请输入"
                :min="0"
                :step="0.01"
                :precision="2"
                clearable
                style="width: 100%"
                @change="() => calculateTotalPrice(scope.row)"
              />
            </template>
          </el-table-column>
          <el-table-column label="总价(元)" prop="totalPrice" width="120">
            <template #default="scope">
              <span>{{ scope.row.totalPrice || '0.00' }}</span>
            </template>
          </el-table-column>
          <el-table-column label="生产人" prop="schedulingUserId" width="150">
            <template #default="scope">
              <el-select
                v-model="scope.row.schedulingUserId"
                placeholder="选择人员"
                style="width: 100%;"
                filterable
                default-first-option
                :reserve-keyword="false"
                     >
                        <el-option
                           v-for="user in userList"
                           :key="user.userId"
                           :label="user.nickName"
                           :value="user.userId"
                        />
                     </el-select>
                  </el-form-item>
               </el-col>
          <el-col :span="12">
            <el-form-item label="生产日期:" prop="schedulingDate">
              >
                <el-option
                  v-for="user in userList"
                  :key="user.userId"
                  :label="user.nickName"
                  :value="user.userId"
                />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column label="生产日期" prop="schedulingDate" width="150">
            <template #default="scope">
              <el-date-picker
                  v-model="form.schedulingDate"
                  type="date"
                  placeholder="请选择日期"
                  value-format="YYYY-MM-DD"
                  format="YYYY-MM-DD"
                  clearable
                  style="width: 100%"
                v-model="scope.row.schedulingDate"
                type="date"
                placeholder="请选择日期"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                clearable
                style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
            </template>
          </el-table-column>
        </el-table>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
@@ -93,7 +110,7 @@
</template>
<script setup>
import {ref} from "vue";
import {ref, reactive, toRefs, getCurrentInstance} from "vue";
import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
import {userListNoPageByTenantId} from "@/api/system/user.js";
import {productionReport, productionReportUpdate} from "@/api/productionManagement/productionReporting.js";
@@ -103,76 +120,128 @@
const userList = ref([])
const dialogFormVisible = ref(false);
const operationType = ref('')
const reportList = ref([])
const data = reactive({
  form: {
      successNum: "",
      schedulingNum: "",
      finishedNum: "",
      schedulingUserId: "",
      schedulingDate: "",
      unitPrice: "",
      totalPrice: "",
  },
  rules: {
      schedulingNum: [{ required: true, message: "请输入", trigger: "blur" },],
  },
});
const { form, rules } = toRefs(data);
const { rules } = toRefs(data);
// 打开弹框
const openDialog = (type, row) => {
const openDialog = (type, rows) => {
  operationType.value = type;
  dialogFormVisible.value = true;
   userListNoPageByTenantId().then((res) => {
      userList.value = res.data;
   });
   form.value = {...row}
   // 处理多条数据
   const rowsArray = Array.isArray(rows) ? rows : [rows];
   reportList.value = rowsArray.map(row => {
      const total = Number(row?.schedulingNum ?? 0);
      const pendingFinish = Number(row?.pendingFinishNum ?? 0);
      const autoFill = pendingFinish > 0 ? Math.min(pendingFinish, total) : total;
      const unitPrice = row?.unitPrice ? Number(row.unitPrice) : 0.33;
      return {
         id: row?.id ?? null,
         salesContractNo: row?.salesContractNo ?? '',
         productCategory: row?.productCategory ?? '',
         specificationModel: row?.specificationModel ?? '',
         schedulingNum: total,
         pendingNum: Math.max(total - autoFill, 0),
         finishedNum: autoFill,
         unitPrice: unitPrice,
         totalPrice: (autoFill * unitPrice).toFixed(2),
         schedulingUserId: row?.schedulingUserId ?? '',
         schedulingDate: row?.schedulingDate ?? '',
      };
   });
}
const changeNum = (value) => {
   if (value > form.value.schedulingNum) {
      form.value.finishedNum = form.value.schedulingNum;
const changeNum = (row, value) => {
   if (value > row.schedulingNum) {
      row.finishedNum = row.schedulingNum;
      proxy.$modal.msgWarning('本次生产数量不可大于排产数量')
   }
   form.value.pendingNum = form.value.schedulingNum - form.value.finishedNum;
   calculateTotalPrice();
   row.pendingNum = row.schedulingNum - row.finishedNum;
   calculateTotalPrice(row);
}
// 计算总价
const calculateTotalPrice = () => {
   const quantity = Number(form.value.finishedNum ?? 0);
   const unitPrice = Number(form.value.unitPrice ?? 0);
const calculateTotalPrice = (row) => {
   const quantity = Number(row.finishedNum ?? 0);
   const unitPrice = Number(row.unitPrice ?? 0);
   
   if (quantity > 0 && unitPrice > 0) {
      form.value.totalPrice = (quantity * unitPrice).toFixed(2);
      row.totalPrice = (quantity * unitPrice).toFixed(2);
   } else {
      form.value.totalPrice = '0.00';
      row.totalPrice = '0.00';
   }
}
// 提交产品表单
const submitForm = () => {
  proxy.$refs.formRef.validate(valid => {
    if (valid) {
      form.value.staffState = 1
      if (operationType.value === "add") {
            productionReport(form.value).then(res => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        })
      } else {
            productionReportUpdate(form.value).then(res => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        })
      }
    }
  })
   // 验证数据
   for (let i = 0; i < reportList.value.length; i++) {
      const item = reportList.value[i];
      if (!item.finishedNum || item.finishedNum <= 0) {
         proxy.$modal.msgError(`第${i + 1}行本次生产数量需大于0`);
         return;
      }
      if (item.finishedNum > item.schedulingNum) {
         proxy.$modal.msgError(`第${i + 1}行本次生产数量不可大于排产数量`);
         return;
      }
      if (!item.schedulingUserId) {
         proxy.$modal.msgError(`第${i + 1}行请选择生产人`);
         return;
      }
      if (!item.schedulingDate) {
         proxy.$modal.msgError(`第${i + 1}行请选择生产日期`);
         return;
      }
   }
   // 构建提交数据数组
   const payloadList = reportList.value.map(item => ({
      id: item.id,
      finishedNum: Number(item.finishedNum),
      unitPrice: Number(item.unitPrice || 0.33),
      totalPrice: Number(item.totalPrice || 0),
      schedulingUserId: item.schedulingUserId,
      schedulingDate: item.schedulingDate,
   }));
   if (operationType.value === "add") {
      productionReport(payloadList).then(res => {
         proxy.$modal.msgSuccess("提交成功");
         closeDia();
      }).catch(err => {
         console.error('提交失败:', err);
      })
   } else {
      // 编辑模式,逐条更新
      Promise.all(payloadList.map(item => productionReportUpdate(item)))
         .then(() => {
            proxy.$modal.msgSuccess("提交成功");
            closeDia();
         })
         .catch(err => {
            console.error('提交失败:', err);
            proxy.$modal.msgError('提交失败,请重试');
         });
   }
}
// 关闭弹框
const closeDia = () => {
  proxy.resetForm("formRef");
  if (proxy.$refs.formRef) {
    proxy.resetForm("formRef");
  }
  dialogFormVisible.value = false;
  reportList.value = [];
  emit('close')
};
defineExpose({