src/views/business/productOrder/components/addOrder.vue
@@ -1,48 +1,76 @@
<template>
  <div class="app-container">
    <div v-show="!cableConfigShow&&!auxiliaryShow">
      <div style="display: flex;justify-content: space-between;align-items:center;">
        <div>委托单信息</div>
        <div>
          <el-cascader
            v-model="addObj.quarterItemId"
            :disabled="active>1"
            :options="quarterItemOptions"
            size="small"
            style="width: 380px"
            @focus="getQuarterOnOrderList"></el-cascader>
          <el-select v-show="active==1" v-model="template" placeholder="下单模板" size="small"
                     @change="selectInsOrderTemplateById">
            <el-option v-for="(a, ai) in templates" :key="ai" :label="a.name" :value="a.id">
              <div style="display: flex; align-items: center; justify-content: space-between;">
                <span>{{ a.name }}</span>
                <i class="el-icon-delete"
                   style="color: #66b1ff; font-size: 16px; cursor: pointer;"
                   @click.stop="handleDelete(a)">
                </i>
              </div>
            </el-option>
          </el-select>
          <el-button v-show="active==1" size="small" @click="templateDia=true">
            <span style="color: #3A7BFA;">保存模板</span>
          </el-button>
          <el-button v-if="active==1&&addObj.sampleType!=undefined&&(addObj.sampleType.indexOf('电缆')>-1 ||addObj.sampleType.indexOf('综合')>-1)" size="small" type="primary" @click="openCableConfig">电缆配置</el-button>
          <el-button v-if="active==1&&addObj.sampleType!=undefined&&addObj.sampleType.indexOf('电缆')>-1" size="small" type="primary" @click="openAuxiliaryCore">辅助线芯配置</el-button>
          <el-button v-show="active==1||(tabIndex==4&&active==2)" :loading="saveLoad" size="small" type="primary" @click="save">提交</el-button>
          <!-- 审核 -->
          <el-button v-show="active==3" :disabled="saveLoad" :loading="saveLoad" size="small"
                     @click="upInsOrderOfState(2)">不通过</el-button>
          <el-button v-show="active==3" :loading="saveLoad" size="small" type="primary"
                     @click="upInsOrderOfState(1)">通过</el-button>
          <el-button size="small" @click="goBack">
            <span style="color: #3A7BFA;">返回</span>
          </el-button>
        </div>
    <div v-show="!cableConfigShow&&!auxiliaryShow" class="order-header">
      <span class="order-header__title">委托单信息</span>
      <div class="order-header__actions">
<!--        <el-cascader-->
<!--          v-model="addObj.quarterItemId"-->
<!--          :disabled="active>1"-->
<!--          :options="quarterItemOptions"-->
<!--          placeholder="请选择季度"-->
<!--          size="small"-->
<!--          class="order-header__quarter"-->
<!--          @focus="getQuarterOnOrderList"></el-cascader>-->
        <el-select v-show="active==1" v-model="template" placeholder="下单模板" size="small"
                   class="order-header__template"
                   @change="selectInsOrderTemplateById">
          <el-option v-for="(a, ai) in templates" :key="ai" :label="a.name" :value="a.id">
            <div style="display: flex; align-items: center; justify-content: space-between;">
              <span>{{ a.name }}</span>
              <i class="el-icon-delete"
                 style="color: #66b1ff; font-size: 16px; cursor: pointer;"
                 @click.stop="handleDelete(a)">
              </i>
            </div>
          </el-option>
        </el-select>
        <el-button v-show="active==1" size="small" @click="templateDia=true">保存模板</el-button>
        <el-button v-if="active==1&&addObj.sampleType!=undefined&&(addObj.sampleType.indexOf('电缆')>-1 ||addObj.sampleType.indexOf('综合')>-1)" size="small" type="primary" plain @click="openCableConfig">电缆配置</el-button>
        <el-button v-if="active==1&&addObj.sampleType!=undefined&&addObj.sampleType.indexOf('电缆')>-1" size="small" type="primary" plain @click="openAuxiliaryCore">辅助线芯配置</el-button>
        <el-button v-show="active==1||(tabIndex==4&&active==2)" :loading="saveLoad" size="small" type="primary" @click="save">提交</el-button>
        <!-- 审核 -->
        <el-button v-show="active==3" :disabled="saveLoad" :loading="saveLoad" size="small"
                   @click="upInsOrderOfState(2)">不通过</el-button>
        <el-button v-show="active==3" :loading="saveLoad" size="small" type="primary"
                   @click="upInsOrderOfState(1)">通过</el-button>
        <el-button size="small" @click="goBack">返回</el-button>
      </div>
    </div>
    <div v-show="!cableConfigShow&&!auxiliaryShow" style="margin-top: 10px">
      <div class="search">
        <el-form ref="addObj" :inline="true" :model="addObj" :rules="addObjRules" label-width="108px" label-position="right">
    <div v-show="!cableConfigShow&&!auxiliaryShow" class="order-body">
      <el-card shadow="never" class="order-card">
        <el-form ref="newJuOrder" :model="addObj" size="small" label-width="108px" label-position="right">
          <el-row :gutter="16">
            <el-col :span="6"><el-form-item label="检测依据"><el-input v-model="addObj.sample" disabled size="small"><template slot="append"><el-button :disabled="active>1" icon="el-icon-search" @click="selectStandardTree = true" /></template></el-input></el-form-item></el-col>
            <el-col :span="18">
              <el-form-item label="原始记录模板">
                <div v-loading="templateBindingLoading" class="template-tag-list">
                  <el-tag v-for="(item, index) in boundTemplateList" :key="item.templateId" :closable="active==1" size="small" effect="plain" @close="removeBoundTemplate(index)">{{ item.name }}</el-tag>
                  <span v-if="!templateBindingLoading && boundTemplateList.length === 0" class="empty-template-text">暂未绑定原始记录模板</span>
                </div>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="16">
            <el-col :span="6"><el-form-item label="样品名称"><el-input v-model="addObj.sampleView" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="生产单位"><el-input v-model="addObj.production" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="委托单位"><el-input v-model="addObj.company" disabled size="small"><template slot="append"><el-button :disabled="active>1" icon="el-icon-search" @click="openCompanyList" /></template></el-input></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="检验类别"><el-select v-model="addObj.orderType" :disabled="active>1" size="small"><el-option v-for="item in dict.type.check_type1" :key="item.value" :label="item.label" :value="item.value" /></el-select></el-form-item></el-col>
          </el-row>
          <el-row :gutter="16">
            <el-col :span="6"><el-form-item label="样品数量"><el-input v-model="addObj.testQuantity" :disabled="active>1" placeholder="如:2桶、500mL" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="样品编号"><el-input v-model="sampleCode" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="样品外观"><el-input v-model="addObj.sampleStatus" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="送样人"><el-input v-model="addObj.prepareUser" :disabled="active>1" size="small" /></el-form-item></el-col>
          </el-row>
          <el-row :gutter="16">
            <el-col :span="6"><el-form-item label="生产日期"><el-date-picker v-model="addObj.productionDate" type="date" value-format="yyyy-MM-dd" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="生产批号"><el-input v-model="addObj.productionBatch" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="送样日期"><el-date-picker v-model="addObj.sampleDate" type="date" value-format="yyyy-MM-dd" :disabled="active>1" size="small" /></el-form-item></el-col>
            <el-col :span="6"><el-form-item label="联系方式"><el-input v-model="addObj.phone" :disabled="active>1" size="small" /></el-form-item></el-col>
          </el-row>
          <el-row :gutter="16"><el-col :span="12"><el-form-item label="备注"><el-input v-model="addObj.remark" :disabled="active>1" size="small" /></el-form-item></el-col></el-row>
        </el-form>
        <el-form v-if="false" ref="addObj" :inline="true" :model="addObj" :rules="addObjRules" label-width="108px" label-position="right">
          <el-row>
            <el-col :span="6">
              <el-form-item label="委托编号:" prop="entrustCode">
@@ -204,8 +232,8 @@
            </el-col>
          </el-row>
        </el-form>
      </div>
      <div>
      </el-card>
      <div v-if="false">
        <div style="display: flex;justify-content: space-between;background-color: #F5F7FB;margin-bottom: 6px">
          <div v-if="active==1">
            <el-form :inline="true" :model="addObj1" label-width="90px">
@@ -427,7 +455,7 @@
              <el-col :span="24">
                <span><i
                    :class="`node_i ${data.children != undefined ? (data.code==='[1]'?'el-icon-folder-opened':'el-icon-folder') : 'el-icon-tickets'}`"></i>
                  {{ data.code }} {{ data.label }}</span>
                  {{ data.label }}</span>
              </el-col>
            </el-row>
          </div>
@@ -606,7 +634,7 @@
  upInsOrderOfState
} from "@/api/business/add";
import {selectUserCondition} from "@/api/performance/class";
import {selectsStandardMethodByFLSSM} from "@/api/standard/standardLibrary";
import {selectTemplateBindings, selectsStandardMethodByFLSSM} from "@/api/standard/standardLibrary";
import limsTable from "@/components/Table/lims-table.vue";
import {selectCustomPageList} from "@/api/system/customer";
import {mapGetters} from "vuex";
@@ -615,7 +643,6 @@
import {
  isLeafPath,
  buildSelectTree,
  deriveTreeFields,
  dropLastLabel,
} from "@/utils/standardTree";
@@ -644,6 +671,9 @@
      active: '',
      tabIndex: '',
      currentId: '',
      sampleCode: '',
      boundTemplateList: [],
      templateBindingLoading: false,
      sampleSelectionList: [],//样品表格选中数据
      editTable:[],
      template: null,
@@ -672,7 +702,7 @@
        orderType: null,
        send: 1,
        formType: '送检', //  来样方式
        sampleStatus: 'In good condition', // 样品状态
        sampleStatus: '', // 样品状态
        testQuantity: '', // 样品状态
        production: null,
        productionEn: null,
@@ -698,7 +728,7 @@
          { required: true, message: '请选择紧急程度', trigger: 'change' }
        ],
        sample: [
          { required: true, message: '请选择样品名称', trigger: 'change' }
          { required: true, message: '请选择检测依据', trigger: 'change' }
        ],
        sampleNum: [
          { required: true, message: '请填写样品数量', trigger: 'blur' }
@@ -927,6 +957,8 @@
          };
          this.addObj.type = String(this.addObj.type)
          const samples = this.HaveJson(res.data.sampleProduct)
          this.sampleCode = samples.length ? samples[0].sampleCode || '' : ''
          this.boundTemplateList = this.sortTemplateList(res.data.templateList)
          const loadSamples = this.canSelectProduct
            ? Promise.all(samples.map(sample => this.loadSelectableProducts(sample)))
            : Promise.resolve(samples)
@@ -1157,6 +1189,14 @@
        return str.replaceAll(find, value);
      },
      save() {
        if (this.addObj.standardTreeId) {
          if (!this.addObj.sample || !this.addObj.company || !this.addObj.orderType || !this.addObj.testQuantity) {
            this.$message.error('请填写检测依据、委托单位、检验类别和样品数量');
            return;
          }
          this.saveData([]);
          return;
        }
        this.$refs['addObj'].validate((valid) => {
          if (valid) {
            this.sampleList.forEach(item => {
@@ -1337,6 +1377,10 @@
        }
      },
      saveMethod(sampleList){
        if (this.addObj.standardTreeId) {
          this.saveData([]);
          return;
        }
        if (this.addObj.quarterItemId) {
          this.addObj.quarterItemId = this.addObj.quarterItemId[1]
        }
@@ -1383,7 +1427,18 @@
        })
      }else{
        // 常规提交
        addInsOrder({insOrder: {...this.addObj,typeSource:-1}, sampleList: sampleList}).then(res => {
        const newJuOrder = {...this.addObj,typeSource:-1}
        delete newJuOrder.temperature
        delete newJuOrder.humidity
        const payload = this.addObj.standardTreeId
          ? {
              insOrder: newJuOrder,
              standardTreeId: this.addObj.standardTreeId,
              sampleCode: this.sampleCode,
              templateList: this.boundTemplateList.map((item, index) => ({ templateId: item.templateId, sort: index }))
            }
          : { insOrder: {...this.addObj,typeSource:-1}, sampleList: sampleList }
        addInsOrder(payload).then(res => {
          this.saveLoad = false
          this.$message.success('已提交')
          this.bsm3Dia = false;
@@ -1512,38 +1567,34 @@
        return data.label.indexOf(value) !== -1;
      },
      activeStandardTree() {
        const fields = deriveTreeFields(this.selectTreeNode)
        if (fields.labels.length < 2) {
          this.$message.error('未选择对象')
        if (!this.selectTreeNode || this.selectTreeNode.data.code !== '[2]') {
          this.$message.error('请选择二级产品')
          return
        }
        this.addObj.factory = fields.factory
        this.addObj.laboratory = fields.laboratory
        this.addObj.sampleType = fields.sampleType
        this.addObj.sample = fields.sample || fields.sampleType
        this.addObj.sampleView = this.addObj.sample
        this.addObj.sampleViewEn = this.sampleViewEn
        this.addObj.model = fields.model
        const productName = this.selectTreeNode.data.label
        this.addObj.sample = productName
        this.addObj.standardTreeId = this.selectTreeNode.data.id
        this.loadTemplateBindings(this.addObj.standardTreeId)
        this.selectStandardTree = false
        this.sampleList = []
        for (var i = 0; i < this.addObj.sampleNum; i++) {
          this.sample.joinName = null
          this.sample.joinModel = null
          this.sample.joinNum = 1
          this.sample.sample = this.addObj.sample
          this.sample.model = this.addObj.model
          this.sample.unit = this.addObj.unit
          this.sample.standardMethodListId = null
          this.sample.insProduct = []
          this.sample.id = this.count
          this.sample.childSampleList = []
          this.sample.insulating = null
          this.sample.sheath = null
          this.sampleList.push(this.HaveJson(this.sample))
          this.count++
      },
      sortTemplateList(list) {
        return (list || []).slice().sort((a, b) => (a.sort || 0) - (b.sort || 0))
      },
      // 下单时从标准库绑定的模板里删减,提交时随 templateList 一起下发
      removeBoundTemplate(index) {
        this.boundTemplateList.splice(index, 1)
      },
      async loadTemplateBindings(standardTreeId) {
        this.boundTemplateList = []
        if (!standardTreeId) return
        this.templateBindingLoading = true
        try {
          const res = await selectTemplateBindings({standardTreeId})
          this.boundTemplateList = this.sortTemplateList(res.data)
        } finally {
          this.templateBindingLoading = false
        }
        this.$refs.sampleTable.doLayout()
        // this.selectsStandardMethodByFLSSM()
      },
      // 用指定型号替换树路径末段(末段即标准/型号)
      buildFactoryPath(model) {
@@ -2334,4 +2385,71 @@
  color: orange;
  font-size: 18px;
}
.template-tag-list {
  min-height: 32px;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}
.empty-template-text {
  color: #909399;
}
/* 委托单信息:顶部操作栏 */
.order-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  padding-bottom: 12px;
  border-bottom: 1px solid #ebeef5;
}
.order-header__title {
  font-size: 16px;
  font-weight: bold;
  color: #303133;
}
.order-header__actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}
/* 间距统一交给 gap,去掉相邻按钮自带的 margin-left */
.order-header__actions>>>.el-button+.el-button {
  margin-left: 0;
}
.order-header__quarter {
  width: 220px;
}
.order-header__template {
  width: 160px;
}
/* 委托单信息:表单卡片 */
.order-body {
  margin-top: 12px;
}
.order-card>>>.el-card__body {
  padding: 20px 20px 6px;
}
.order-card>>>.el-form-item {
  margin-bottom: 16px;
}
/* 控件统一占满标签之外的整列宽度:el-date-editor 默认写死 220px、
   el-select 宽度收缩成固有宽度,不指定就会和其他输入框左右边缘对不齐 */
.order-card>>>.el-input,
.order-card>>>.el-select {
  width: 100%;
}
/* append 单元格的 20px 内边距 + 按钮 -10px 负边距是按默认 40px 按钮标定的,
   small 输入下按钮会比输入框高、上下溢出;改成按钮直接撑满单元格 */
.order-card>>>.el-input-group__append {
  padding: 0;
}
.order-card>>>.el-input-group__append .el-button {
  margin: 0;
  padding: 9px 15px;
  font-size: 12px;
}
</style>