src/views/business/productOrder/components/addOrder.vue
@@ -300,19 +300,27 @@
            </template>
          </el-table-column>
        </el-table>
        <div v-if="canSelectProduct" style="display: flex; align-items: center; gap: 12px; padding: 10px 0;">
          <span>检测范围:</span>
          <el-radio-group v-model="inspectionScope" size="small" @change="changeInspectionScope">
            <el-radio-button label="all">全部检验</el-radio-button>
            <el-radio-button label="specified">指定检验项</el-radio-button>
          </el-radio-group>
          <span>已选 {{ selectedProductCount }} / 共 {{ productList.length }} 项</span>
        </div>
        <el-table ref="productTable" v-loading="getProductLoad" :data="productList"
                  :row-class-name="tableRowClassName" border class="el-table"
                  :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }"
          max-height="400px" style="margin-bottom: 10px;" tooltip-effect="dark"
          @select="selectOne" @selection-change="selectProduct" @select-all="handleAll">
          <el-table-column v-if="active==1" :selectable="selectable0" type="selection" width="65"></el-table-column>
          <el-table-column v-if="canSelectProduct" :selectable="selectable0" type="selection" width="65"></el-table-column>
          <el-table-column label="检验项分类" min-width="140" prop="inspectionItemClass" show-overflow-tooltip></el-table-column>
          <el-table-column label="检验项" min-width="140" prop="inspectionItem" show-overflow-tooltip>
            <template slot="header" slot-scope="scope">
              <div style="display: flex;align-items: center;flex-direction: column;font-size: 14px">
                <span>检验项</span>
                <el-input
                  v-if="active==1"
                  v-if="canSelectProduct"
                v-model="inspectionItem"
                placeholder="请输入"
                size="mini"
@@ -326,7 +334,7 @@
              <div style="display: flex;align-items: center;flex-direction: column;font-size: 14px">
                <span>检验项子项</span>
                <el-input
                  v-if="active==1"
                  v-if="canSelectProduct"
                  v-model="inspectionItemSubclass"
                  placeholder="请输入"
                  size="mini"
@@ -368,7 +376,7 @@
              <div style="display: flex;align-items: center;flex-direction: column;font-size: 14px">
                <span>试验方法</span>
                <el-input
                  v-if="active==1"
                  v-if="canSelectProduct"
                  v-model="methodS"
                  placeholder="请输入"
                  size="mini"
@@ -463,10 +471,10 @@
            </div>
          </el-col>
          <el-col v-if="distributeData.userId" :span="22" class="search_thing">
            <div class="search_label"><span class="required-span">* </span>试验室:</div>
            <div class="search_label">试验室:</div>
            <div class="search_input">
              <el-select v-model="distributeData.sonLaboratory" filterable placeholder="请选择" size="small" style="width: 100%;">
                <el-option v-for="item in sonLaboratoryList" :key="item.value" :label="item.label" :value="item.value">
                <el-option v-for="item in newJuLaboratoryList" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </div>
@@ -602,6 +610,7 @@
import limsTable from "@/components/Table/lims-table.vue";
import {selectCustomPageList} from "@/api/system/customer";
import {mapGetters} from "vuex";
import { bigEval } from "@/utils/bigEval";
import {addQuarter, updateQuarterOnOrder} from "@/api/business/finishedProductSampling";
export default {
@@ -613,8 +622,17 @@
  },
  computed:{
    ...mapGetters(["nickName", 'nameEn', 'userName']),
    canSelectProduct() {
      return this.active == 1 || (this.tabIndex == 4 && this.active == 2)
    },
    selectedProductCount() {
      return this.productList.filter(item => item.state == 1).length
    },
    newJuLaboratoryList() {
      return (this.dict.type.sys_sub_lab || []).filter(item => item.label === '新聚')
    },
  },
  dicts: ['check_type1', 'urgency_level', 'form_type', 'sample_status_list'],
  dicts: ['check_type1', 'urgency_level', 'form_type', 'sample_status_list', 'sys_sub_lab'],
  data() {
    return {
      active: '',
@@ -687,12 +705,6 @@
        ],
        testQuantity: [
          { required: true, message: '请填写抽检数量', trigger: 'blur' }
        ],
        production: [
          { required: true, message: '请填写生产单位', trigger: 'blur' }
        ],
        productionEn: [
          { required: true, message: '请填写生产单位EN', trigger: 'blur' }
        ],
      },
      sample: {
@@ -795,6 +807,7 @@
      quarterItemOptions: [], // 查询季度信息
      specialStandardMethod: '',
      isSpecial: false,
      inspectionScope: 'all',
    }
  },
  watch: {
@@ -860,6 +873,37 @@
    this.getInfo();
  },
  methods: {
    /**
     * 获取小数的最大位数
     * @param number  型号参数
     * @param ask     要求值
     * @param calcNum 计算值
     */
    getDecimalPlaces(number, ask, calcNum) {
      console.log("计算小数点-->", number, ask, calcNum);
      let count1 = 0;
      let count2 = 0;
      const reg = /(\d+\.)(\d+)/g;
      let matches = [];
      if (ask) {
        matches = ask.match(reg);
      }
      if (
        matches &&
        matches.length > 0 &&
        matches[0].toString().indexOf(".") > -1
      ) {
        count1 = matches[0].toString().split(".")[1].length;
      }
      if (number.toString().indexOf(".") > -1) {
        count2 = number.toString().split(".")[1].length;
      }
      if (calcNum.toString().indexOf(".") > -1) {
        const pointLength2 = calcNum.toString().split(".")[1].length;
        count2 = count2 > pointLength2 ? count2 : pointLength2;
      }
      return count1 > count2 ? count1 : count2;
    },
    getInfo() {
      this.selectStandardTreeList()
      this.getAuthorizedPerson();
@@ -874,16 +918,22 @@
            ...res.data.insOrder
          };
          this.addObj.type = String(this.addObj.type)
          this.sampleList = this.HaveJson(res.data.sampleProduct);
          this.specialStandardMethod = this.sampleList[0].specialStandardMethod
          this.getProNum()
          this.addObj.sampleNum = this.sampleList.length
          this.$nextTick(() => {
            this.$refs.sampleTable.doLayout()
            if (this.addObj.sampleNum > 0) {
              this.$refs.sampleTable.setCurrentRow(this.sampleList[0], true)
              this.rowClick(this.sampleList[0])
            }
          const samples = this.HaveJson(res.data.sampleProduct)
          const loadSamples = this.canSelectProduct
            ? Promise.all(samples.map(sample => this.loadSelectableProducts(sample)))
            : Promise.resolve(samples)
          loadSamples.then(sampleList => {
            this.sampleList = sampleList
            this.specialStandardMethod = this.sampleList[0].specialStandardMethod
            this.getProNum()
            this.addObj.sampleNum = this.sampleList.length
            this.$nextTick(() => {
              this.$refs.sampleTable.doLayout()
              if (this.addObj.sampleNum > 0) {
                this.$refs.sampleTable.setCurrentRow(this.sampleList[0], true)
                this.rowClick(this.sampleList[0])
              }
            })
          })
        })
      }
@@ -1045,7 +1095,13 @@
              let index = code.findIndex(b => m.includes(b))
              if (index > -1) {
                let arr = m.split(code[index]).filter(b => !!b)
                let num = eval(this.replaceAll(arr[0], symbolItem, value))
                let calcNum = this.$Big(
                  bigEval(this.replaceAll(arr[0], symbolItem, value))
                );
                let num = calcNum.toFixed(
                  this.getDecimalPlaces(value, ask, calcNum)
                );
                // let num = eval(this.replaceAll(arr[0], symbolItem, value))
                m = code[index] + '' + num
                arr1.push(m)
              }
@@ -1074,7 +1130,13 @@
            let index = code.findIndex(b => ask.includes(b))
            if (index > -1) {
              let arr = ask.split(code[index]).filter(b => !!b)
              let num = eval(this.replaceAll(arr[0], symbolItem, value))
              let calcNum = this.$Big(
                bigEval(this.replaceAll(arr[0], symbolItem, value))
              );
              let num = calcNum.toFixed(
                this.getDecimalPlaces(value, ask, calcNum)
              );
              // let num = eval(this.replaceAll(arr[0], symbolItem, value))
              return code[index] + '' + num
            }
          }
@@ -1122,22 +1184,23 @@
                  if (this.tabIndex != 4) {
                    delete c.id
                  }
                  if (c.isNew) {
                    c.id = null
                    delete c.isNew
                  }
                })
              }
              if (a.endModels) {
                a.model = a.endModels
              }
              a.insProduct = a.insProduct.filter(b=>b.state === 1)
              if (!this.canSelectProduct || this.active == 1) {
                a.insProduct = a.insProduct.filter(b=>b.state === 1)
              }
            })
            let projectNum = this.totalArr.filter(a => a.state == 1).length
            if(projectNum==0){
              this.$confirm('检验项目为空,是否确认提交?', "提示", {
                confirmButtonText: "确定",
                cancelButtonText: "取消",
                type: "warning"
              }).then(() => {
                this.saveMethod(sampleList)
              }).catch(() => {})
              this.$message.warning('请至少选择一个检验项')
              return
            }else{
              let isRTS = this.totalArr.find(a => a.ask != null && this.symbolList.find(b=>a.ask.includes(b)) && a.state == 1)
              if (isRTS) {
@@ -1162,12 +1225,18 @@
                if (this.tabIndex != 4) {
                  delete c.id
                }
                if (c.isNew) {
                  c.id = null
                  delete c.isNew
                }
              })
            }
            if (a.endModels) {
              a.model = a.endModels
            }
            a.insProduct = a.insProduct.filter(b=>b.state === 1)
            if (!this.canSelectProduct || this.active == 1) {
              a.insProduct = a.insProduct.filter(b=>b.state === 1)
            }
          })
          this.saveMethod(sampleList)
        }else{
@@ -1306,7 +1375,7 @@
        })
      }else{
        // 常规提交
        addInsOrder({insOrder: this.addObj, sampleList: sampleList}).then(res => {
        addInsOrder({insOrder: {...this.addObj,typeSource:-1}, sampleList: sampleList}).then(res => {
          this.saveLoad = false
          this.$message.success('已提交')
          this.bsm3Dia = false;
@@ -1335,6 +1404,7 @@
              this.distributeData.appointed = ress.data
            })
            setTimeout(() => {
              this.distributeData.sonLaboratory = this.newJuLaboratoryList.length > 0 ? this.newJuLaboratoryList[0].value : ''
              this.issuedDialogVisible = true;
            }, 1000)
          })
@@ -1351,10 +1421,6 @@
        }
        if (this.distributeData.userId == null || this.distributeData.userId == '') {
          this.$message.error('指派人员未填写')
          return
        }
        if (this.distributeData.userId&&(this.distributeData.sonLaboratory== null ||this.distributeData.sonLaboratory== '')) {
          this.$message.error('试验室未填写')
          return
        }
        this.upLoad = true;
@@ -1386,8 +1452,8 @@
          this.addObj.code = selects.code
          this.addObj.phone = selects.phone
          this.addObj.companyId = selects.departId
          this.addObj.production = '中天科技装备电缆有限公司'
          this.addObj.productionEn = 'Zhongtian Technology Industrial Wire&Cable System CO.,LTD'
          this.addObj.production = ''
          this.addObj.productionEn = ''
          if(this.active==1){
            this.selectInsOrderTemplate()
          }
@@ -1584,6 +1650,9 @@
        }
        this.productList = row.insProduct
        this.productList0 = JSON.parse(JSON.stringify(this.productList))
        this.inspectionScope = this.productList.length === 0
          ? (this.active == 1 ? 'all' : 'specified')
          : (this.productList.every(item => item.state == 1) ? 'all' : 'specified')
        setTimeout(() => {
          this.productList.forEach(a => {
            if (a.state == 1) {
@@ -1653,6 +1722,9 @@
        })
        this.changeProductList0()
        this.currentMethod.insProduct = this.productList0
        this.inspectionScope = this.productList.length > 0 && this.productList.every(item => item.state == 1)
          ? 'all'
          : 'specified'
        this.getProNum()
      },
      permute(nums) {
@@ -1773,7 +1845,7 @@
          conductorType: row.conductorType,
        }).then(res => {
          res.data.forEach(a => {
            a.state = 0
            a.state = this.inspectionScope === 'all' ? 1 : 0
          })
          row.insProduct = this.HaveJson(res.data)
          this.getProductLoad = false
@@ -1788,6 +1860,9 @@
            this.productList.forEach(a => {
              if (a.state == 1) this.toggleSelection(a)
            })
            if (this.inspectionScope === 'all') {
              this.handleAll(this.productList.filter(item => this.selectable0(item)))
            }
          }, 200)
        })
      },
@@ -1835,7 +1910,7 @@
          factory: selectTreeList.join(" - "),
        }).then(res => {
          res.data.forEach(a => {
            a.state = 0
            a.state = this.inspectionScope === 'all' ? 1 : 0
          })
          row.insProduct = this.HaveJson(res.data)
          this.getProductLoad = false
@@ -1846,6 +1921,9 @@
            this.productList.forEach(a => {
              if (a.state == 1) this.toggleSelection(a)
            })
            if (this.inspectionScope === 'all') {
              this.handleAll(this.productList.filter(item => this.selectable0(item)))
            }
          }, 200)
        })
      },
@@ -1914,7 +1992,7 @@
        }
      },
      selectable0(row,index) {
        if (this.active > 1||row.repetitionTag) {
        if (!this.canSelectProduct||row.repetitionTag) {
          return false
        } else {
          return true
@@ -1985,17 +2063,57 @@
            return item
          })
        }
        this.productList.forEach(item => {
          if (item.id == row.id) {
            item.state = row.state;
          }
        })
        this.changeProductList0()
        this.currentMethod.insProduct = this.productList0
        this.inspectionScope = e.length > 0 ? 'all' : 'specified'
        this.getProNum()
        this.$nextTick(() => {
          this.$refs.productTable.doLayout()
        })
      },
      changeInspectionScope(scope) {
        if (scope !== 'all' || this.productList.length === 0) return
        this.$refs.productTable.clearSelection()
        this.productList.forEach(item => {
          if (this.selectable0(item)) this.$refs.productTable.toggleRowSelection(item, true)
        })
        this.handleAll(this.productList.filter(item => this.selectable0(item)))
      },
      inspectionProductKey(product) {
        return [
          product.structureItemParameterId,
          product.inspectionItemClass,
          product.inspectionItem,
          product.inspectionItemSubclass
        ].join('|')
      },
      loadSelectableProducts(sample) {
        const selectedProducts = sample.insProduct || []
        if (!sample.standardMethodListId) return Promise.resolve(sample)
        const product = selectedProducts[0] || {}
        const factory = [
          product.factory || this.addObj.factory,
          product.laboratory || this.addObj.laboratory,
          product.sampleType || this.addObj.sampleType,
          product.sample || sample.sample,
          product.model || sample.model
        ].join(' - ')
        return selectStandardProductList({
          model: sample.model,
          modelNum: sample.modelNum,
          standardMethodListId: sample.standardMethodListId,
          factory,
          cores: sample.cores,
          conductorMaterial: sample.conductorMaterial,
          conductorType: sample.conductorType
        }).then(res => {
          const selectedKeys = new Set(selectedProducts.map(item => this.inspectionProductKey(item)))
          const availableProducts = (res.data || [])
            .filter(item => !selectedKeys.has(this.inspectionProductKey(item)))
            .map((item, index) => ({...item, id: `new-${sample.id}-${index}`, state: 0, isNew: true}))
          sample.insProduct = selectedProducts.concat(availableProducts)
          return sample
        }).catch(() => sample)
      },
      submitTell() {
        if (!this.tell) {
@@ -2180,8 +2298,8 @@
        })
      },
      changeUser(){
        if(this.sonLaboratoryList.length>0){
          this.distributeData.sonLaboratory = this.sonLaboratoryList[0].value
        if(this.newJuLaboratoryList.length>0){
          this.distributeData.sonLaboratory = this.newJuLaboratoryList[0].value
        }
      },
      addProductList(productList,row,index){