| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952 | <template>  <div class="borderless">    <div class="customer-head">      <div class="customer-back">        <el-button          type="danger"          style="border: none;background: none;color: red"          icon="el-icon-arrow-left"          @click="backToList"          >返回列表        </el-button>      </div>      <el-button type="success" class="copy-customer-btn" disabled>        复制新单      </el-button>      <el-button        class="el-button--small-yh add-customer-btn"        type="primary"        :disabled="disabled"        @click="editCustomer"        >{{ form.id ? "确认修改" : "确认新增" }}      </el-button>    </div>    <div style="margin-top: 60px;margin-bottom:35px">      <containerTitle title="基础信息"></containerTitle>      <basic-container>        <avue-form ref="form" v-model="form" :option="option">          <template slot="corpId">            <select-component              v-model="form.corpId"              :configuration="configuration"              :disabled="detailData.status == 1"            ></select-component>          </template>        </avue-form>      </basic-container>      <div>        <containerTitle title="商品信息"></containerTitle>        <basic-container>          <avue-crud            ref="crud"            :data="data"            :option="tableOption"            @row-del="rowDel"            @selection-change="goodsSelectionChange"            @saveColumn="saveColumn"            :summary-method="summaryMethod"          >            <template slot="price" slot-scope="{ row }">              <el-input                v-if="row.$cellEdit"                v-model="row.price"                size="small"                oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'                @change="priceChange(row)"              ></el-input>              <span v-else>{{ row.price }}</span>            </template>            <template slot="orderQuantity" slot-scope="{ row }">              <el-input                v-if="row.$cellEdit"                v-model="row.orderQuantity"                size="small"                oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'                @change="quantityChange(row)"              ></el-input>              <span v-else>{{ row.orderQuantity }}</span>            </template>            <template slot="cname" slot-scope="{ row, index }">              <el-button                size="small"                type="text"                @click="rePick(row, index)"                :disabled="disabled"                class="picker"                style="padding:4px 10px;float:left"                >选择</el-button              >              <span> {{ row.cname }}</span>            </template>            <template slot="itemType" slot-scope="{ row }">              <el-select                v-if="row.$cellEdit"                v-model="row.itemType"                filterable                allow-create                default-first-option                placeholder="请输入"                @focus="itemTypeFocus(row)"              >                <el-option                  v-for="(item, index) in itemtypeList"                  :key="index"                  :label="item.value"                  :value="item.value"                >                </el-option>              </el-select>              <span v-else>{{ row.itemType }}</span>            </template>            <template slot="menuLeft">              <el-button                type="primary"                icon="el-icon-plus"                size="small"                @click.stop="newDetails"                :disabled="detailData.status == 1"                >新增明细</el-button              >              <el-button                type="info"                icon="el-icon-printer"                size="small"                @click.stop="openReport()"                >报 表</el-button              >              <el-button                type="warning"                icon="el-icon-plus"                size="small"                :disabled="detailData.status == 1 || orderItemIds.length == 0"                @click="getInvoice"                >生成收货单              </el-button>            </template>            <template slot="menu" slot-scope="{ row, index }">              <el-button                size="small"                icon="el-icon-edit"                type="text"                @click="rowCell(row, index)"                :disabled="disabled"                >{{ row.$cellEdit ? "保存" : "修改" }}</el-button              >              <el-button                size="small"                icon="el-icon-edit"                type="text"                @click="rowDel(row, index)"                :disabled="detailData.status == 1"                >删 除</el-button              >            </template>          </avue-crud>        </basic-container>      </div>      <fee-info        ref="feeInfo"        :orderFeesList="orderFeesList"        :disabled="detailData.status == 1"        feeUrl="/trade-purchase/purchase-order/removeByFees"      />      <upload-file        ref="uploadFile"        title="合同附件"        :orderFilesList="orderFilesList"        :disabled="detailData.status == 1"        delUrl="/trade-purchase/purchase-order/removeByFiles"      />      <div>        <containerTitle title="银行信息"></containerTitle>        <basic-container>          <avue-form ref="form" v-model="form" :option="bankOption" />        </basic-container>      </div>    </div>    <el-dialog      title="导入商品"      append-to-body      class="el-dialogDeep"      :visible.sync="dialogVisible"      width="60%"      :close-on-click-modal="false"      :destroy-on-close="true"      :close-on-press-escape="false"      @close="closeGoods"      top="10vh"    >      <span>        <el-row>          <el-col :span="5">            <div>              <el-scrollbar>                <basic-container style="margin-top:45px">                  <avue-tree :option="treeOption" @node-click="nodeClick" />                </basic-container>              </el-scrollbar>            </div>          </el-col>          <el-col :span="19">            <avue-crud              :option="goodsOption"              :table-loading="loading"              :data="goodsList"              ref="goodsCrud"              @refresh-change="refreshChange"              @selection-change="selectionChange"              @row-click="rowClick"              :page.sync="page"              @on-load="onLoad"              @saveColumn="saveGoodsColumn"            ></avue-crud>          </el-col>        </el-row>      </span>      <span slot="footer" class="dialog-footer">        <el-button @click="dialogVisible = false">取 消</el-button>        <el-button          type="primary"          @click="importGoods"          :disabled="selectionList.length == 0"          >导入</el-button        >      </span>    </el-dialog>    <report-dialog      :switchDialog="switchDialog"      :reportId="form.id"      reportName="客户询价"      @onClose="onClose()"    ></report-dialog>  </div></template><script>import tableOption from "./config/customerContact.json";import goodsOption from "./config/commodity.json";import feeInfo from "@/components/fee-info/main";import uploadFile from "@/components/upload-file/main";import {  detail,  submit,  delItem,  getDeptLazyTree,  getGoods,  getSysNo,  getSpecification} from "@/api/exportTrade/purchaseContract";import _ from "lodash";import reportDialog from "@/components/report-dialog/main";import { contrastObj, contrastList } from "@/util/contrastData";import {  isvalidatemobile,  validatename,  micrometerFormat} from "@/util/validate";export default {  name: "detailsPageEdit",  data() {    const validatePhone = (rule, value, callback) => {      if (value != "") {        if (isvalidatemobile(value)[0]) {          this.$message.error("手机号码格式不正确");          callback(new Error(isvalidatemobile(value)[1]));        } else {          callback();        }      } else {        callback();      }    };    const validateName = (rule, value, callback) => {      if (value != "") {        if (validatename(value)) {          this.$message.error("联系人格式不正确");          callback(new Error(validatename(value)));        } else {          callback();        }      } else {        callback();      }    };    return {      configuration: {        multipleChoices: false,        multiple: false,        collapseTags: false,        placeholder: "请点击右边按钮选择",        dicData: []      },      switchDialog: false,      form: {        orderStatus: "录入"      },      disabled: false,      dialogVisible: false,      tableOption: tableOption,      option: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "客户名称",            prop: "corpId",            rules: [              {                required: true,                message: "",                trigger: "blur"              }            ],            span: 16,            slot: true          },          {            label: "系统号",            prop: "sysNo",            span: 8,            disabled: true          },          {            label: "联系人",            prop: "corpAttn",            span: 8          },          {            label: "电话",            prop: "corpTel",            span: 8          },          {            label: "订单状态",            prop: "orderStatus",            span: 8,            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=order_status",            props: {              label: "dictValue",              value: "dictValue"            }          },          {            label: "采购日期",            prop: "businesDate",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd 00:00:00"          },          {            label: "预计交货日期",            prop: "plannedDeliveryDate",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd 00:00:00"          },          {            label: "实际交货日期",            prop: "requiredDeliveryDate",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd 00:00:00"          },          {            label: "是否开票",            prop: "ifInvoice",            span: 8,            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=ifInvoice",            props: {              label: "dictValue",              value: "dictValue"            }          },          {            label: "付款方式",            prop: "paymentType",            span: 8,            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=payment_term",            props: {              label: "dictValue",              value: "dictValue"            }          },          {            label: "付款说明",            prop: "paymentTypeDescription",            span: 8          },          {            label: "币别",            prop: "currency",            span: 8,            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=currency",            props: {              label: "dictValue",              value: "dictValue"            },            change: ({ value }) => {              if (value == "人民币") {                this.form.exchangeRate = 1;              }              if (value == "美元") {                this.form.exchangeRate = 6.3843;              }            }          },          {            label: "汇率",            prop: "exchangeRate",            span: 8,            slot: true,            row: true,            disabled:true          },          {            label: "备注",            prop: "orderRemark",            type: "textarea",            minRows: 2,            span: 24          }        ]      },      treeOption: {        nodeKey: "id",        lazy: true,        treeLoad: function(node, resolve) {          const parentId = node.level === 0 ? 0 : node.data.id;          getDeptLazyTree(parentId).then(res => {            resolve(              res.data.data.map(item => {                return {                  ...item,                  leaf: !item.hasChildren                };              })            );          });        },        addBtn: false,        menu: false,        size: "small",        props: {          label: "title",          value: "value",          children: "children"        }      },      bankOption: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "银行",            prop: "banks",            span: 8          },          {            label: "银行信息",            prop: "banksAccountName",            span: 16,            type: "textarea",            minRows: 2          }        ]      },      insuranceOption: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "保险描述",            prop: "insuranceRemarks",            span: 24,            type: "textarea",            minRows: 2          }        ]      },      markOption: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "唛头描述",            prop: "marks",            span: 24,            type: "textarea",            minRows: 2          }        ]      },      page: {        pageSize: 10,        currentPage: 1,        total: 0      },      loading: false,      goodsOption: {},      data: [],      goodsList: [],      selectionList: [],      treeDeptId: null,      orderFeesList: [],      orderFilesList: [],      orderItemIds: [],      itemtypeList: [],      goodsSelections: [],      reData: null    };  },  props: {    detailData: {      type: Object    }  },  components: {    reportDialog,    feeInfo,    uploadFile  },  async created() {    this.tableOption = await this.getColumnData(      this.getColumnName(3),      tableOption    );    this.goodsOption = await this.getColumnData(      this.getColumnName(27),      goodsOption    );    if (this.detailData.id) {      this.getDetail(this.detailData.id);    }    if (this.detailData.status == 1) {      this.option.disabled = true;      this.bankOption.disabled = true;      this.insuranceOption.disabled = true;      this.markOption.disabled = true;    }    let _this = this;    this.tableOption.column.forEach(e => {      if (e.prop == "taxRate") {        e.formatter = function(row) {          return _this.textFormat(            Number(row.taxRate ? row.taxRate : 0) / 100,            "0.00%"          );        };      }      if (e.prop == "amount" || e.prop == "price") {        e.formatter = function(row) {          return _this.textFormat(            Number(row.amount ? row.amount : 0),            "#,##0.00"          );        };      }    });    if (this.detailData.pageType == "new") {      getSysNo().then(res => {        this.form.sysNo = res.data.data;      });    }    this.getWorkDicts("product_properties").then(res => {      this.findObject(this.tableOption.column, "itemProp").dicData =        res.data.data;    });  },  methods: {    rePick(row, index) {      this.reData = {        ...row,        index: index      };      this.newDetails();    },    rowCell(row, index) {      if (row.$cellEdit == true) {        this.$set(row, "$cellEdit", false);      } else {        this.$set(row, "$cellEdit", true);      }    },    itemTypeFocus(row) {      this.itemtypeList = [];      getSpecification({ goodId: row.itemId }).then(res => {        const data = res.data.data;        this.itemtypeList = data.map(item => ({ value: item }));      });    },    priceChange(row) {      console.log(row);      if (!row.price) {        row.price = 0;      } else {        row.amount = _.multiply(row.price, row.orderQuantity).toFixed(2);      }    },    quantityChange(row) {      if (Number(row.orderQuantity) < Number(row.actualQuantity)) {        row.orderQuantity = row.actualQuantity;        this.$message.error("修改的数量不能低于已收数量");      }      if (!row.orderQuantity) {        row.orderQuantity = 0;      } else {        row.amount = _.multiply(row.price, row.orderQuantity).toFixed(2);      }    },    rowSave(row) {      console.log(row);      this.$set(row, "$cellEdit", false);    },    rowDel(row, index) {      this.$confirm("确定删除数据?", {        confirmButtonText: "确定",        cancelButtonText: "取消",        type: "warning"      }).then(() => {        if (row.id) {          delItem(row.id).then(res => {            this.$message({              type: "success",              message: "删除成功!"            });            this.data.splice(index, 1);          });        } else {          this.$message({            type: "success",            message: "删除成功!"          });          this.data.splice(index, 1);        }      });    },    importGoods() {      if (this.reData) {        console.log(this.reData);        if (this.selectionList.length != 1) {          return this.$message.error("重新选择的时候只能选择一条数据");        } else {          this.selectionList.forEach(e => {            this.data.forEach((item, index) => {              if (index == this.reData.index) {                item.itemId = e.id;                item.code = e.code;                item.cname = e.cname;                item.priceCategory = e.goodsTypeName;                item.itemUrl = e.url;                item.itemProp = this.reData.itemProp;                item.itemDescription = e.cnameDescription;                item.itemType = this.reData.itemType;                item.tradeTerms = this.reData.tradeTerms;                item.price = this.reData.price;                item.orderQuantity = this.reData.orderQuantity;                item.insurance = this.reData.insurance;                item.freight = this.reData.freight;                item.discount = this.reData.discount;                item.amount = this.reData.amount;                item.taxRate = this.reData.taxRate;                item.unit = e.unit;                item.remarks = this.reData.remarks;                item.$cellEdit = true;              }            });          });        }      } else {        this.selectionList.forEach(e => {          this.data.push({            itemId: e.id,            code: e.code,            cname: e.cname,            priceCategory: e.goodsTypeName,            itemUrl: e.url,            itemProp: null,            itemDescription: e.cnameDescription,            itemType: null,            tradeTerms: null,            price: 0,            orderQuantity: 0,            insurance: 0,            freight: 0,            discount: null,            amount: 0,            taxRate: 0,            unit: e.unit,            remarks: null,            $cellEdit: true          });        });      }      this.dialogVisible = false;    },    closeGoods() {      this.selectionList = [];      this.treeDeptId = "";      this.reData = null;    },    goodsSelectionChange(list) {      this.goodsSelections = list;      this.orderItemIds = [];      list.map(e => {        this.orderItemIds.push(e.id);      });    },    selectionChange(list) {      this.selectionList = list;    },    rowClick(row) {      this.$refs.goodsCrud.toggleSelection([this.goodsList[row.$index]]);    },    nodeClick(data) {      this.treeDeptId = data.id;      this.page.currentPage = 1;      this.onLoad(this.page);    },    //费用查询    onLoad(page, params = {}) {      this.loading = true;      getGoods(page.currentPage, page.pageSize, this.treeDeptId).then(res => {        const data = res.data.data;        this.page.total = data.total;        this.goodsList = data.records;        this.loading = false;        if (this.page.total) {          this.goodsOption.height = window.innerHeight - 550;        } else {          this.goodsOption.height = window.innerHeight - 475;        }      });    },    //商品明细导入    newDetails() {      this.dialogVisible = !this.dialogVisible;    },    getDetail(id) {      detail(id).then(res => {        this.form = res.data.data;        this.data = res.data.data.itemsVOList ? res.data.data.itemsVOList : [];        this.orderFeesList = res.data.data.orderFeesList          ? res.data.data.orderFeesList          : [];        this.orderFilesList = res.data.data.orderFilesList          ? res.data.data.orderFilesList          : [];        this.configuration.dicData = this.form.corpsName;      });    },    //修改提交触发    editCustomer() {      this.$refs["form"].validate((valid, done) => {        done();        if (valid) {          const orderFeesList = this.$refs.feeInfo.submitData();          for (let i = 0; i < orderFeesList.length; i++) {            if (orderFeesList[i].corpId == null) {              return this.$message.error(`请输入第${i + 1}行的结算中心`);            }            if (orderFeesList[i].price == 0) {              return this.$message.error(`请正确输入第${i + 1}行的价格`);            }            if (orderFeesList[i].quantity == 0) {              return this.$message.error(`请正确输入第${i + 1}行的数量`);            }          }          const orderFilesList = this.$refs.uploadFile.submitData();          submit({            ...this.form,            itemsVOList: this.data,            orderFeesList: orderFeesList,            orderFilesList: orderFilesList,            tradeType: "CK",            billType: "CG"          }).then(res => {            this.$message.success(this.form.id ? "修改成功" : "提交成功");            this.getDetail(res.data.data);          });        } else {          return false;        }      });    },    //返回列表    backToList() {      this.$emit("goBack");    },    openReport() {      this.switchDialog = !this.switchDialog;    },    onClose(val) {      this.switchDialog = val;    },    summaryMethod({ columns, data }) {      const sums = [];      if (columns.length > 0) {        columns.forEach((item, index) => {          sums[0] = "合计";          if (item.property == "orderQuantity" || item.property == "amount") {            let qtySum = 0;            let amountSum = 0;            data.forEach(e => {              qtySum = _.add(qtySum, Number(e.orderQuantity));              amountSum = _.add(amountSum, Number(e.amount));            });            //数量总计            if (item.property == "orderQuantity") {              sums[index] = qtySum ? qtySum.toFixed(2) : "0.00";            }            //金额总计            if (item.property == "amount") {              sums[index] = micrometerFormat(amountSum);            }          }        });      }      return sums;    },    getInvoice() {      if (!this.form.id) {        return this.$message.error("数据未提交,请提交数据");      }      for (let i = 0; i < this.goodsSelections.length; i++) {        if (!this.goodsSelections[i].id) {          return this.$message.error("明细表未提交数据,请提交数据");        }      }      if (this.$store.getters.outtaskStatus) {        this.$alert("出口发货单存在,请保存发货单再进行操作", "温馨提示", {          confirmButtonText: "确定",          type: "warning",          callback: action => {            console.log(action);          }        });      } else {        this.inInvoice();      }    },    inInvoice() {      const data = this.deepClone(this.form);      data.orderItemsList = this.deepClone(this.goodsSelections);      data.orderItemsList.forEach(e => {        e.actualQuantity = e.orderQuantity;        e.contractAmount = e.amount;        e.srcId = e.id;        e.packageRemarks = e.itemProp;        e.productDesc = e.itemDescription;        e.specificationAndModele = e.itemType;        delete e.id;        delete e.version;        delete e.status;        delete e.createUser;        delete e.createTime;        delete e.updateUser;        delete e.updateTime;        delete e.isDeleted;      });      delete data.id;      delete data.version;      delete data.status;      delete data.createUser;      delete data.createTime;      delete data.updateUser;      delete data.updateTime;      delete data.isDeleted;      delete data.orderStatus;      data.deliveryStatus = "录入";      data.srcOrderNo = data.sysNo;      delete data.sysNo;      data.corpName = data.corpsName;      delete data.corpsName;      this.$refs.crud.toggleSelection();      this.$router.$avueRouter.closeTag("/exportTrade/receipt/index");      this.$router.push({        path: "/exportTrade/receipt/index",        query: {          pageType: "Generate",          data: JSON.stringify(data)        }      });    },    async saveColumn() {      const inSave = await this.saveColumnData(        this.getColumnName(3),        this.tableOption      );      if (inSave) {        this.$message.success("保存成功");        //关闭窗口        this.$refs.crud.$refs.dialogColumn.columnBox = false;      }    },    async saveGoodsColumn() {      const inSave = await this.saveColumnData(        this.getColumnName(27),        this.goodsOption      );      if (inSave) {        this.$message.success("保存成功");        //关闭窗口        this.$refs.goodsCrud.$refs.dialogColumn.columnBox = false;      }    }  }};</script><style lang="scss" scoped>.customer-head {  position: fixed;  top: 105px;  width: 100%;  margin-left: -10px;  height: 62px;  background: #ffffff;  box-shadow: 0 4px 12px 0px rgba(232, 232, 235, 1);  z-index: 999;}.customer-back {  cursor: pointer;  line-height: 62px;  font-size: 16px;  color: #323233;  font-weight: 400;}.back-icon {  line-height: 64px;  font-size: 20px;  margin-right: 8px;}.copy-customer-btn {  position: fixed;  right: 140px;  top: 115px;}.add-customer-btn {  position: fixed;  right: 36px;  top: 115px;}::v-deep .el-form-item {  margin-bottom: 8px;}::v-deep .el-form-item__error {  display: none;}::v-deep .select-component {  display: flex;}</style>
 |