zss
2024-07-01 e3f6f75938f45f2672bf0f0320cb92a4f96ff696
Merge remote-tracking branch 'origin/master'
已修改6个文件
已添加1个文件
288 ■■■■■ 文件已修改
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/do/b1-ins-order/add.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/do/b1-inspect-order-plan/Inspection.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tool/excel.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/downExcelByLuckSheet.js 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/util/excelFountion.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -35,6 +35,7 @@
    "muse-ui": "^3.0.2",
    "node-emoji": "^1.11.0",
    "popper.js": "^1.16.1",
    "print-js": "^1.6.0",
    "qs": "^6.11.0",
    "sweetalert": "^2.1.2",
    "tinymce": "^5.10.3",
src/components/do/b1-ins-order/add.vue
@@ -256,14 +256,14 @@
        <el-col class="search_thing" :span="6">
          <div class="search_label">工程名称:</div>
          <div class="search_input">
            <el-input size="small" placeholder="请输入" clearable v-model="addObj.engineering"
            <el-input size="small" :placeholder="active>1 ? '' : '请输入'" clearable v-model="addObj.engineering"
              :readonly="active>1"></el-input>
          </div>
        </el-col>
        <el-col class="search_thing" :span="6">
          <div class="search_label">工程名称EN:</div>
          <div class="search_input">
            <el-input size="small" placeholder="请输入" clearable v-model="addObj.engineeringEn"
            <el-input size="small" :placeholder="active>1 ? '' : '请输入'" clearable v-model="addObj.engineeringEn"
              :readonly="active>1"></el-input>
          </div>
        </el-col>
@@ -302,19 +302,19 @@
        <el-col class="search_thing" :span="6">
          <div class="search_label">OTC订单号:</div>
          <div class="search_input">
            <el-input size="small" placeholder="请输入" clearable v-model="addObj.otcCode" :readonly="active>1"></el-input>
            <el-input size="small" :placeholder="active>1 ? '' : '请输入'" clearable v-model="addObj.otcCode" :readonly="active>1"></el-input>
          </div>
        </el-col>
        <el-col class="search_thing" :span="6">
          <div class="search_label">委托人:</div>
          <div class="search_input">
            <el-input size="small" placeholder="请输入" clearable v-model="addObj.prepareUser" :readonly="active>1"></el-input>
            <el-input size="small" :placeholder="active>1 ? '' : '请输入'" clearable v-model="addObj.prepareUser" :readonly="active>1"></el-input>
          </div>
        </el-col>
        <el-col class="search_thing" :span="6" style="align-items: flex-start;margin: 8px 0;">
          <div class="search_label">备注:</div>
          <div class="search_input">
            <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 2}" size="small" clearable
            <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 2}" size="small" clearable :placeholder="active>1 ? '' : '请输入'"
              v-model="addObj.remark" :readonly="active>1"></el-input>
          </div>
        </el-col>
@@ -331,7 +331,7 @@
        <div class="search_thing">
          <div class="search_label">样品型号:</div>
          <div class="search_input">
            <el-select v-model="model" placeholder="请选择" filterable allow-create default-first-option size="small"
            <el-select v-model="model" :placeholder="active>1 ? '' : '请输入'" filterable allow-create default-first-option size="small"
              @change="changeModel">
              <el-option v-for="item in models" :key="item.value" :label="item.label" :value="item.value">
              </el-option>
@@ -341,7 +341,7 @@
        <div class="search_thing">
          <div class="search_label">检验标准:</div>
          <div class="search_input">
            <el-select v-model="standardMethodListId" placeholder="请选择" size="small" @focus="methodFocus"
            <el-select v-model="standardMethodListId" :placeholder="active>1 ? '' : '请输入'" size="small" @focus="methodFocus"
              :loading="methodLoad" @change="changeStandardMethodListId">
              <el-option v-for="item in methods" :key="item.id" :label="item.code" :value="item.id">
              </el-option>
@@ -414,7 +414,17 @@
        @selection-change="selectProduct" style="margin-bottom: 10px;" @select="upProductSelect"
        :row-class-name="tableRowClassName" v-loading="getProductLoad" @select-all="handleAll">
        <el-table-column type="selection" width="65" :selectable="selectable" v-if="active==1"></el-table-column>
        <el-table-column prop="inspectionItem" label="检验项" min-width="140" show-overflow-tooltip></el-table-column>
        <el-table-column prop="inspectionItem" label="检验项" min-width="140" 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-model="inspectionItem"
              size="mini"
              placeholder="请输入"/>
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="inspectionItemSubclass" label="检验项子项" min-width="140"
          show-overflow-tooltip></el-table-column>
        <el-table-column prop="sonLaboratory" label="子实验室" min-width="130" show-overflow-tooltip :filters="filters"
@@ -865,7 +875,8 @@
        model: null,
        standardMethodListId: null,
        symbolList:[
        'RTS','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
        'RTS','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],
        inspectionItem:null,
      }
    },
    watch: {
src/components/do/b1-inspect-order-plan/Inspection.vue
@@ -1251,8 +1251,10 @@
              })
            })
            if (item.v.ps != undefined && item.v.ps.value == '结论') {
              try {
              if (this.currentSample.insProduct.find(m => m.id == item.i)) {
                let ask = this.currentSample.insProduct.find(m => m.id == item.i).ask?this.currentSample.insProduct.find(m => m.id == item.i).ask.split('&'):null;
                console.log(comValue)
                let res = Object.values(comValue)[0]
                let comp = []
                console.log(res, ask)
@@ -1303,6 +1305,10 @@
                }
                this.saveInsContext()
              }
              } catch (error) {
              }
            } else {
              let comResult = ''
              try {
@@ -1409,6 +1415,7 @@
              //     }
              //     break;
              // }
              try {
              list.forEach(a => {
                if (a[0].r == item.r && comResult !== '') {
                  for (var b in a) {
@@ -1425,10 +1432,17 @@
                }
              })
              this.changeInput(comResult, `${id}-${item.r}-${item.c}-${pId}`) //改变最终值
              } catch (error) {
              }
            }
          }
        })
        try {
        this.getCurrentInsProduct(pId)
        } catch (error) {
        }
      },
      getCurrentInsProduct(pId) {
        if (!this.tableList[0].insProductResult) {
@@ -1743,6 +1757,7 @@
        return
      },
      saveInsContext() {
        if(this.param){
        this.$axios.post(this.$api.insOrderPlan.saveInsContext, {
          param: JSON.stringify(this.param)
        }).then(res => {
@@ -1752,6 +1767,7 @@
          }
          this.$message.success('已保存')
        })
        }
      },
      changeEquip(val, n) {
        for (let i in this.equipOptions) {
src/components/tool/excel.vue
@@ -39,7 +39,7 @@
</template>
<script>
import { data } from 'jquery';
import {exportExcel} from '../../util/downExcelByLuckSheet'
    // import { data } from 'jquery';
    export default {
        props: ['data', 'execlTitle'],
src/main.js
@@ -15,9 +15,9 @@
Vue.prototype.PROJECT = '检测中心'
// Vue.prototype.PROJECT = '装备电缆'
//本地
Vue.prototype.LOCATIONVUE = "http://127.0.0.1:80";
// Vue.prototype.LOCATIONVUE = "http://127.0.0.1:80";
// const javaApi = 'http://127.0.0.1:8001';
const javaApi = 'http://192.168.0.104:8001';
const javaApi = 'http://192.168.47.249:8001';
//云
// Vue.prototype.LOCATIONVUE = "http://114.132.189.42:8080";
src/util/downExcelByLuckSheet.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,193 @@
// const Excel = require('exceljs')
const exportExcel =  async function (luckysheet) { // å‚数为luckysheet.getluckysheetfile()获取的对象
    // 1.创建工作簿,可以为工作簿添加属性
    const workbook = new Excel.Workbook()
    // 2.创建表格,第二个参数可以配置创建什么样的工作表
    luckysheet.every(function (table) {
        if (table.data.length === 0) return true
        const worksheet = workbook.addWorksheet(table.name)
        // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
        setStyleAndValue(table.data, worksheet)
        setMerge(table.config.merge, worksheet)
        setBorder(table.config.borderInfo, worksheet)
        return true
    })
    // 4.写入 buffer
    const buffer = await workbook.xlsx.writeBuffer()
    return buffer
}
var setMerge = function (luckyMerge = {}, worksheet) {
    const mergearr = Object.values(luckyMerge)
    mergearr.forEach(function (elem) { // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
        // æŒ‰å¼€å§‹è¡Œï¼Œå¼€å§‹åˆ—,结束行,结束列合并(相当于 K10:M12)
        worksheet.mergeCells(elem.r + 1, elem.c + 1, elem.r + elem.rs, elem.c + elem.cs)
    })
}
var setBorder = function (luckyBorderInfo, worksheet) {
    if (!Array.isArray(luckyBorderInfo)) return
    luckyBorderInfo.forEach(function (elem) {
        let border = borderConvert(elem.borderType, elem.style, elem.color)
        let rang = elem.range[0]
        // console.log(rang.column_focus + 1, rang.row_focus + 1)
        worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
    })
}
var setStyleAndValue = function (cellArr, worksheet) {
    if (!Array.isArray(cellArr)) return
    cellArr.forEach(function (row, rowid) {
        row.every(function (cell, columnid) {
            if (!cell) return true
            let fill = fillConvert(cell.bg)
            let font = fontConvert(cell.ff, cell.fc, cell.bl, cell.it, cell.fs, cell.cl, cell.ul)
            let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr)
            let value
            if (cell.f) {
                value = { formula: cell.f, result: cell.v }
            } else {
                value = cell.v
            }
            let target = worksheet.getCell(rowid + 1, columnid + 1)
            target.fill = fill
            target.font = font
            target.alignment = alignment
            target.value = value
            return true
        })
    })
}
var fillConvert = function (bg) {
    if (!bg) {
        return {}
    }
    let fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: {argb: bg.replace('#', '')}
    }
    return fill
}
var fontConvert = function (ff = 0, fc = '#000000', bl = 0, it = 0, fs = 10, cl = 0, ul = 0) { // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
    const luckyToExcel = {
        0: '微软雅黑',
        1: '宋体(Song)',
        2: '黑体(ST Heiti)',
        3: '楷体(ST Kaiti)',
        4: '仿宋(ST FangSong)',
        5: '新宋体(ST Song)',
        6: '华文新魏',
        7: '华文行楷',
        8: '华文隶书',
        9: 'Arial',
        10: 'Times New Roman ',
        11: 'Tahoma ',
        12: 'Verdana',
        num2bl: function (num) {
            return num === 0 ? false : true
        }
    }
    let font = {
        name: luckyToExcel[ff],
        family: 1,
        size: fs,
        color: {argb: fc.replace('#', '')},
        bold: luckyToExcel.num2bl(bl),
        italic: luckyToExcel.num2bl(it),
        underline: luckyToExcel.num2bl(ul),
        strike: luckyToExcel.num2bl(cl)
    }
    return font
}
var alignmentConvert = function (vt = 'default', ht = 'default', tb = 'default', tr = 'default') { // luckysheet:vt(垂直), ht(æ°´å¹³), tb(换行), tr(旋转)
    const luckyToExcel = {
        vertical: {
            0: 'middle',
            1: 'top',
            2: 'bottom',
            default: 'top'
        },
        horizontal: {
            0: 'center',
            1: 'left',
            2: 'right',
            default: 'left'
        },
        wrapText: {
            0: false,
            1: false,
            2: true,
            default: false
        },
        textRotation: {
            0: 0,
            1: 45,
            2: -45,
            3: 'vertical',
            4: 90,
            5: -90,
            default: 0
        }
    }
    let alignment = {
        vertical: luckyToExcel.vertical[vt],
        horizontal: luckyToExcel.horizontal[ht],
        wrapText: luckyToExcel.wrapText[tb],
        textRotation: luckyToExcel.textRotation[tr]
    }
    return alignment
}
var borderConvert = function (borderType, style = 1, color = '#000') { // å¯¹åº”luckysheet的config中borderinfo的的参数
    if (!borderType) {
        return {}
    }
    const luckyToExcel = {
        type: {
            'border-all': 'all',
            'border-top': 'top',
            'border-right': 'right',
            'border-bottom': 'bottom',
            'border-left': 'left'
        },
        style: {
            0: 'none',
            1: 'thin',
            2: 'hair',
            3: 'dotted',
            4: 'dashDot', // 'Dashed',
            5: 'dashDot',
            6: 'dashDotDot',
            7: 'double',
            8: 'medium',
            9: 'mediumDashed',
            10: 'mediumDashDot',
            11: 'mediumDashDotDot',
            12: 'slantDashDot',
            13: 'thick'
        }
    }
    let template = {style: luckyToExcel.style[style], color: {argb: color.replace('#', '')}}
    let border = {}
    if (luckyToExcel.type[borderType] === 'all') {
        border['top'] = template
        border['right'] = template
        border['bottom'] = template
        border['left'] = template
    } else {
        border[luckyToExcel.type[borderType]] = template
    }
    return border
}
export default{
  exportExcel
}
src/util/excelFountion.js
@@ -6,6 +6,7 @@
 * @returns è¿”回所有参数的和,如果参数列表为空或参数类型非数值型,则返回null
 */
function SUM(...val){
  try {
  let num = null;
  if(val&&val.length>0){
    val.forEach(item=>{
@@ -13,6 +14,9 @@
    })
  }
  return num;
  } catch (error) {
  }
}
/**
 * è®¡ç®—传入参数中的最大值
@@ -21,6 +25,7 @@
 * @returns è¿”回最大值,如果参数列表为空或为null/undefined/'',则返回null
 */
function MAX(...val){
  try {
  let max = null;
  if(val&&val.length>0){
    val = val.filter(item=>item!=null&&item!=='')
@@ -31,6 +36,9 @@
    }
  }
  return max;
  } catch (error) {
  }
}
/**
 * è®¡ç®—传入参数中的最小值
@@ -39,6 +47,7 @@
 * @returns è¿”回传入参数中的最小值,如果传入参数为空或所有值均为null或空字符串,则返回null
 */
function MIN(...val){
  try {
  let min = null;
  if(val&&val.length>0){
    val = val.filter(item=>item!=null&&item!=='')
@@ -48,6 +57,9 @@
    }
  }
  return min;
  } catch (error) {
  }
}
/**
 * è®¡ç®—给定数值的平均值
@@ -56,6 +68,7 @@
 * @returns è¿”回平均值,如果数值列表为空或包含非数值项,则返回null
 */
function AVERAGE(...val){
  try {
  let num = null;
  let arr = [];
  if(val&&val.length>0){
@@ -71,6 +84,9 @@
  }else{
    return null;
  }
  } catch (error) {
  }
}
/**
 * è®¡ç®—一个数的绝对值
@@ -79,7 +95,11 @@
 * @returns è¿”回该数值的绝对值
 */
function ABS(val){
  try {
  return Math.abs(val);
  } catch (error) {
  }
}
/**
 * è®¡ç®—一组数字的中位数
@@ -88,6 +108,7 @@
 * @returns å¦‚果参数中有有效的数字,则返回计算出的中位数;否则返回null
 */
function MEDIAN(...val){
  try {
  let arr = [];
  if(val&&val.length>0){
    arr = val.filter(item=>item!=null&&item!=='')
@@ -106,6 +127,9 @@
    }
  }else{
    return null;
    }
  } catch (error) {
  }
}
@@ -184,6 +208,7 @@
 * @returns è¿”回一个包含坐标信息的数组
 */
function changeParameter(f){
  try {
  let arr = getABCList(f)
  let arr2 = []
  arr.forEach(item=>{
@@ -205,6 +230,9 @@
    }
  })
  return arr2;
  } catch (error) {
  }
}
/**
 * èŽ·å–åŒ…å« ABC å­—符的列表
@@ -213,6 +241,7 @@
 * @returns åŒ…含 ABC å­—符的数组列表
 */
function getABCList(f){
  try {
  let regex = /[=\+\-\*\%\(\)\/\^\s]/g;
  let fouList = [
    "SUM",
@@ -229,6 +258,9 @@
    return item&& /[a-zA-Z]/.test(item)&&item!='undefined'&&item!='null'
  });
  return arr;
  } catch (error) {
  }
}
/**
 * èŽ·å–æ‰€æœ‰å•å…ƒæ ¼
@@ -237,12 +269,16 @@
 * @returns è¿”回一个对象,其键为单元格的唯一标识符(由列和行ID拼接而成),值为null
 */
function getAllCell(f){
  try {
  let arr = changeParameter(f)
  let arr0 = {}
  arr.forEach(item=>{
    arr0[getColumnNameFromId(`${item.c}`+'-'+`${item.r}`)] = null
  })
  return arr0;
  } catch (error) {
  }
}
/**
@@ -253,6 +289,7 @@
 * @returns è¿”回计算后的结果,如果计算失败则返回0
 */
function compute(f,comValue){
  try {
  let str = f
  // èŽ·å–å•å…ƒæ ¼å¯¹åº”å€¼
  let arr = getAllCell(f)
@@ -294,14 +331,12 @@
    str = str.replaceAll(a, obj[a])
  }
  // è®¡ç®—
  try{
    for (var a in arr) {
      str = str.replaceAll(a, arr[a])
    }
    return eval(str)
  }catch(e){
    console.log('e',e)
    return 0
  } catch (error) {
  }
}