huminmin
2026-07-30 e1570f458b2ab42bb1a212be8de63134a50b2af1
src/views/productionManagement/productionProcess/index.vue
@@ -44,7 +44,9 @@
            <div class="card-body">
              <!-- <div class="process-name">{{ process.name }}</div> -->
              <div class="process-desc">{{ process.remark || '暂无描述' }}</div>
              <div class="process-device">关联设备: {{ deviceOptions.find(item => item.id === Number(process.deviceLedgerId))?.deviceName|| '未关联' }}</div>
              <div class="process-device">关联设备: {{ (deviceOptions.find(item => item.id === Number(process.deviceLedgerId))?.deviceName) || '未关联' }}</div>
              <div class="process-device">标准数量: {{ process.standardQuantity || 0 }}</div>
              <div class="process-device"></div>
            </div>
            <div class="card-footer">
              <div class="status-tag">
@@ -59,12 +61,12 @@
                </el-tag>
                <el-tag v-if="process.type !== null && process.type !== undefined"
                        size="small"
                        :type="process.type == 1 ? 'primary' : 'success'"
                        type="primary"
                        style="margin-left: 8px">
                  {{ process.type == 0 ? '计时' : '计件' }}
                  计件
                </el-tag>
              </div>
              <span class="param-count">工资定额: ¥{{ process.salaryQuota || 0 }}</span>
              <span class="param-count"></span>
            </div>
          </div>
        </div>
@@ -118,11 +120,33 @@
          <el-input v-model="processForm.name"
                    placeholder="请输入工序名称" />
        </el-form-item>
        <el-form-item label="工资定额"
                      prop="salaryQuota">
          <el-input v-model="processForm.salaryQuota"
        <el-form-item label="标准数量"
                      prop="standardQuantity">
          <el-input v-model="processForm.standardQuantity"
                    type="number"
                    :step="0.001" />
                    :step="0.001"
                    placeholder="请输入工序标准数量" />
        </el-form-item>
        <el-form-item label="小提琴系数"
                      prop="violinFactor">
          <el-input v-model="processForm.violinFactor"
                    type="number"
                    :step="0.001"
                    placeholder="请输入小提琴系数" />
        </el-form-item>
        <el-form-item label="大提琴系数"
                      prop="violaFactor">
          <el-input v-model="processForm.violaFactor"
                    type="number"
                    :step="0.001"
                    placeholder="请输入大提琴系数" />
        </el-form-item>
        <el-form-item label="贝斯系数"
                      prop="bassFactor">
          <el-input v-model="processForm.bassFactor"
                    type="number"
                    :step="0.001"
                    placeholder="请输入贝斯系数" />
        </el-form-item>
        <el-form-item label="是否质检"
                      prop="isQuality">
@@ -134,10 +158,12 @@
        </el-form-item>
        <el-form-item label="计费类型"
                      prop="type">
          <el-radio-group v-model="processForm.type">
            <el-radio :label="0">计时</el-radio>
          <el-radio-group v-model="processForm.type" disabled>
            <el-radio :label="1">计件</el-radio>
          </el-radio-group>
          <div style="margin-top: 6px; color: #909399; font-size: 12px;">
            工序仅支持计件
          </div>
        </el-form-item>
        <el-form-item label="关联设备"
                      prop="deviceLedgerId">
@@ -243,6 +269,7 @@
            </el-form-item>
            <el-form-item label="标准值">
              <el-input v-model="selectedParam.standardValue"
                        @input="val => onStandardValueInput(val, selectedParam)"
                        placeholder="请输入默认值" />
            </el-form-item>
          </el-form>
@@ -273,6 +300,7 @@
        <el-form-item label="标准值"
                      prop="standardValue">
          <el-input v-model="editParamForm.standardValue"
                    @input="val => onStandardValueInput(val, editParamForm)"
                    placeholder="请输入标准值" />
        </el-form-item>
      </el-form>
@@ -339,24 +367,85 @@
    id: null,
    no: "",
    name: "",
    salaryQuota: null,
    standardQuantity: null,
    violinFactor: null,
    violaFactor: null,
    bassFactor: null,
    isQuality: false,
    isProduction: false,
    remark: "",
    deviceLedgerId: null,
    type: 0,
    type: 1,
  });
  const processRules = {
    no: [{ required: true, message: "请输入工序编码", trigger: "blur" }],
    name: [{ required: true, message: "请输入工序名称", trigger: "blur" }],
    salaryQuota: [
    standardQuantity: [
      {
        required: false,
        message: "请输入工资定额",
        message: "请输入标准数量",
        trigger: "blur",
        validator: (rule, value, callback) => {
          if (value == null || value === "") {
            callback();
            return;
          }
          if (isNaN(value) || value < 0) {
            callback(new Error("工资定额必须是非负数字"));
            callback(new Error("标准数量必须是非负数字"));
          } else {
            callback();
          }
        },
      },
    ],
    violinFactor: [
      {
        required: false,
        message: "请输入小提琴系数",
        trigger: "blur",
        validator: (rule, value, callback) => {
          if (value == null || value === "") {
            callback();
            return;
          }
          if (isNaN(value) || value < 0) {
            callback(new Error("小提琴系数必须是非负数字"));
          } else {
            callback();
          }
        },
      },
    ],
    violaFactor: [
      {
        required: false,
        message: "请输入大提琴系数",
        trigger: "blur",
        validator: (rule, value, callback) => {
          if (value == null || value === "") {
            callback();
            return;
          }
          if (isNaN(value) || value < 0) {
            callback(new Error("大提琴系数必须是非负数字"));
          } else {
            callback();
          }
        },
      },
    ],
    bassFactor: [
      {
        required: false,
        message: "请输入贝斯系数",
        trigger: "blur",
        validator: (rule, value, callback) => {
          if (value == null || value === "") {
            callback();
            return;
          }
          if (isNaN(value) || value < 0) {
            callback(new Error("贝斯系数必须是非负数字"));
          } else {
            callback();
          }
@@ -366,7 +455,20 @@
    deviceLedgerId: [
      { required: false, message: "请选择设备", trigger: "change" },
    ],
    type: [{ required: false, message: "请选择计费类型", trigger: "change" }],
    type: [
      {
        required: true,
        message: "工序仅支持计件",
        trigger: "change",
        validator: (rule, value, callback) => {
          if (value !== 1) {
            callback(new Error("工序仅支持计件"));
          } else {
            callback();
          }
        },
      },
    ],
  };
  // 参数对话框
@@ -392,7 +494,18 @@
    technologyParamId: null,
    paramName: "",
    standardValue: null,
    paramType: null,
  });
  const onStandardValueInput = (val, target) => {
    const data = target.value || target;
    const type = data.paramType;
    if (type === 1) {
      // 数值格式:不能输入中文或英文字符
      data.standardValue = val.replace(/[a-zA-Z\u4e00-\u9fa5]/g, "");
    }
  };
  const editParamRules = {
    standardValue: [
      {
@@ -403,6 +516,12 @@
          if (value === null || value === undefined || value === "") {
            callback(new Error("请输入标准值"));
          } else {
            const type = editParamForm.paramType;
            if (type === 1 && value) {
              if (/[a-zA-Z\u4e00-\u9fa5]/.test(value)) {
                return callback(new Error("数值格式不能包含中英文字符"));
              }
            }
            callback();
          }
        },
@@ -533,12 +652,15 @@
    processForm.id = null;
    processForm.no = "";
    processForm.name = "";
    processForm.salaryQuota = null;
    processForm.standardQuantity = null;
    processForm.violinFactor = null;
    processForm.violaFactor = null;
    processForm.bassFactor = null;
    processForm.isQuality = false;
    processForm.isProduction = false;
    processForm.remark = "";
    processForm.deviceLedgerId = null;
    processForm.type = 0;
    processForm.type = 1;
    processDialogVisible.value = true;
  };
@@ -547,11 +669,17 @@
    processForm.id = process.id;
    processForm.no = process.no;
    processForm.name = process.name;
    processForm.salaryQuota = process.salaryQuota;
    processForm.standardQuantity = process.standardQuantity;
    processForm.violinFactor = process.violinFactor;
    processForm.violaFactor = process.violaFactor;
    processForm.bassFactor = process.bassFactor;
    processForm.isQuality = !!process.isQuality;
    processForm.isProduction = !!process.isProduction;
    processForm.remark = process.remark || "";
    processForm.deviceLedgerId = Number(process.deviceLedgerId);
    // 如果设备 ID 为 0 或者在设备列表中找不到,则回显为空(null)
    const deviceId = Number(process.deviceLedgerId);
    const hasDevice = deviceOptions.value.some(item => item.id === deviceId);
    processForm.deviceLedgerId = deviceId && hasDevice ? deviceId : null;
    processForm.type = process.type;
    processDialogVisible.value = true;
  };
@@ -717,6 +845,7 @@
    editParamForm.technologyParamId = row.technologyParamId;
    editParamForm.paramName = row.paramName;
    editParamForm.standardValue = row.standardValue;
    editParamForm.paramType = row.paramType;
    editParamDialogVisible.value = true;
  };