| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814 | <template>  <div class="borderless">    <div class="customer-head">      <div class="customer-back">        <!--        <i class="back-icon el-icon-arrow-left"></i><i style="font-style:normal">返回管理列表</i>-->        <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="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 style="margin-bottom: 10px">        <avue-form ref="form" v-model="form" :option="option">          <template slot="portOfLoad">            <port-info              v-model="form.portOfLoad"              :disabled="detailData.status == 1"            />          </template>          <template slot="portOfDestination">            <port-info              v-model="form.portOfDestination"              :disabled="detailData.status == 1"            />          </template>          <template slot="corpId">            <select-component              v-model="form.corpId"              :configuration="configuration"              :disabled="detailData.status == 1"            ></select-component>          </template>          <template slot="exchangeRate">            <el-input              size="mini"              v-model="form.exchangeRate"              oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'              @change="rateChange"              placeholder="请输入 汇率"              :disabled="detailData.status == 1"              ><template slot="append">%</template></el-input            >          </template>        </avue-form>      </basic-container>      <containerTitle title="商品信息"></containerTitle>      <basic-container>        <avue-crud          :ref="crud"          :data="data"          :option="tableOption"          @row-del="rowDel"        >          <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="info"              size="small"              @click.stop="savePurchase"              :disabled="detailData.status == 1"              >采购询价</el-button            >            <el-button              type="info"              size="small"              @click.stop="saveShipping"              :disabled="detailData.status == 1"              >船务询价</el-button            >          </template>          <template slot="menu" slot-scope="scope">            <el-button              size="small"              icon="el-icon-edit"              type="text"              @click="rowDel(scope.row, scope.index)"              :disabled="detailData.status == 1"              >删 除</el-button            >          </template>          <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 | micrometerFormat }}</span>          </template>          <template slot="amount" slot-scope="{ row }">            <span>{{ row.amount | micrometerFormat }}</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="discount" slot-scope="{ row }">            <el-input              v-if="row.$cellEdit"              v-model="row.discount"              size="small"              oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'              @change="discountChange(row)"            ></el-input>            <span v-else>{{ row.discount | isDiscount }}</span>          </template>          <template slot="insurance" slot-scope="{ row }">            <el-input              v-if="row.$cellEdit"              v-model="row.insurance"              size="small"              oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'            ></el-input>            <span v-else>{{ row.insurance | micrometerFormat }}</span>          </template>          <template slot="freight" slot-scope="{ row }">            <el-input              v-if="row.$cellEdit"              v-model="row.freight"              size="small"              oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'            ></el-input>            <span v-else>{{ row.freight | micrometerFormat }}</span>          </template>          <template slot="taxRate" slot-scope="{ row }">            <el-input              v-if="row.$cellEdit"              v-model="row.taxRate"              size="small"              oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'              @change="taxRateChange(row)"            ></el-input>            <span v-else>{{ row.taxRate | isPercentage }}</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>        </avue-crud>      </basic-container>      <fee-info        ref="feeInfo"        :orderFeesList="orderFeesList"        :disabled="detailData.status == 1"        feeUrl="/blade-purchase-sales/orderfees/update"      />    </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"      v-dialog-drag    >      <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"            ></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 {  detail,  submit,  delItem,  getDeptLazyTree,  getGoods,  savePurchase,  saveShipping,  getPorts,  getSpecification} from "@/api/basicData/customerInquiry";import reportDialog from "@/components/report-dialog/main";import { isDiscount, isPercentage, micrometerFormat } from "@/util/validate";import { contrastObj, contrastList } from "@/util/contrastData";import _ from "lodash";export default {  name: "detailsPageEdit",  data() {    return {      itemtypeList: [],      configuration: {        multipleChoices: false,        multiple: false,        collapseTags: false,        placeholder: "请点击右边按钮选择",        dicData: []      },      switchDialog: false,      form: {},      disabled: false,      dialogVisible: false,      tableOption: tableOption,      option: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "客户名称",            prop: "corpId",            rules: [              {                required: true,                message: "",                trigger: "blur"              }            ],            span: 8,            slot: true          },          {            label: "系统号",            prop: "sysNo",            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: "corpAttn",            span: 8          },          {            label: "电话",            prop: "corpTel",            span: 8          },          {            label: "起运港",            prop: "portOfLoad",            span: 8,            type: "select",            filterable: true,            dicData: [],            props: {              label: "name",              value: "name"            }          },          {            label: "目的港",            prop: "portOfDestination",            span: 8,            type: "select",            filterable: true,            dicData: [],            props: {              label: "name",              value: "name"            }          },          {            label: "运输方式",            prop: "transport",            span: 8,            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=mode_transport",            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: "dateValidity",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd 00:00:00"          },          {            label: "价格条款",            prop: "priceTerms",            span: 8,            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=pricing_terms",            props: {              label: "dictValue",              value: "dictValue"            }          },          {            label: "条款说明",            prop: "priceTermsDescription",            span: 8          },          {            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"            }          },          {            label: "汇率",            prop: "exchangeRate",            span: 8,            slot: true          },          {            label: "备注",            prop: "orderRemark",            type: "textarea",            minRows: 2,            span: 16          }        ]      },      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"        }      },      page: {        pageSize: 10,        currentPage: 1,        total: 0      },      loading: false,      goodsOption: goodsOption,      data: [],      goodsList: [],      selectionList: [],      treeDeptId: null,      orderFeesList: [],      oldform: {},      olddata: [],      oldorderFeesList: []    };  },  props: {    detailData: {      type: Object    }  },  components: {    reportDialog,    feeInfo  },  created() {    if (this.detailData.id) {      this.getDetail(this.detailData.id);    }    if (this.detailData.status == 1) {      this.option.disabled = true;    }    getPorts().then(res => {      this.findObject(this.option.column, "portOfLoad").dicData = res.data;      this.findObject(this.option.column, "portOfDestination").dicData =        res.data;    });  },  filters: {    isDiscount(val) {      return isDiscount(val);    },    isPercentage(val) {      return isPercentage(val);    },    micrometerFormat(val) {      return micrometerFormat(val);    }  },  methods: {    itemTypeFocus(row) {      this.itemtypeList = [];      getSpecification({ goodId: row.itemId }).then(res => {        const data = res.data.data;        this.itemtypeList = data.map(item => ({ value: item }));      });    },    priceChange(row) {      if (!row.price) {        row.price = 0;      } else {        row.amount = _.multiply(row.price, row.orderQuantity).toFixed(2);      }    },    discountChange(row) {      if (row.discount >= 10) {        row.discount = 0;        this.$message.error("请正确输入折扣");      }    },    taxRateChange(row) {      if (row.taxRate > 100) {        row.taxRate = 0;        this.$message.error("请正确输入税率");      }    },    quantityChange(row) {      if (!row.orderQuantity) {        row.orderQuantity = 0;      } else {        row.amount = _.multiply(row.price, row.orderQuantity).toFixed(2);      }    },    saveShipping() {      if (!this.form.id) {        return this.$message.error("此单据没有提交记录,请先提交");      }      this.$confirm("是否生成船务询价单?", {        confirmButtonText: "确定",        cancelButtonText: "取消",        type: "warning"      }).then(() => {        saveShipping(this.form.id).then(res => {          if (res.data.code == 200) {            this.$message.success("生成成功");          }        });      });    },    savePurchase() {      if (!this.form.id) {        return this.$message.error("此单据没有提交记录,请先提交");      }      this.$confirm("是否生成采购询价单?", {        confirmButtonText: "确定",        cancelButtonText: "取消",        type: "warning"      }).then(() => {        savePurchase(this.form.id).then(res => {          if (res.data.code == 200) {            this.$message.success("生成成功");          }        });      });    },    rateChange(row) {      console.log(row);      if (row >= 100) {        this.form.exchangeRate = 0;        this.$message.error("汇率不能超过100%");      }    },    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() {      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: null,          itemType: null,          orderQuantity: 0,          tradeTerms: null,          price: 0,          amount: 0,          taxRate: 0,          unit: e.unit,          remarks: null,          $cellEdit: true        });      });      this.dialogVisible = false;    },    closeGoods() {      this.selectionList = [];      this.treeDeptId = "";    },    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;          if (this.page.total) {            this.goodsOption.height = window.innerHeight - 550;          } else {            this.goodsOption.height = window.innerHeight - 475;          }        })        .finally(() => {          this.loading = false;        });    },    //商品明细导入    newDetails() {      this.dialogVisible = !this.dialogVisible;    },    getDetail(id) {      detail(id).then(res => {        this.form = res.data.data;        this.data = res.data.data.orderItemsList;        this.orderFeesList = res.data.data.orderFeesList;        this.configuration.dicData = this.form.corpName;        this.oldform = res.data.data;        this.olddata = this.deepClone(res.data.data.orderItemsList);        this.oldorderFeesList = this.deepClone(res.data.data.orderFeesList);      });    },    //修改提交触发    editCustomer(status) {      this.$refs["form"].validate((valid, done) => {        done();        if (valid) {          let 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].orderQuantity == 0) {              return this.$message.error(`请正确输入第${i + 1}行的数量`);            }          }          submit({            ...this.form,            orderItemsList: this.data,            orderFeesList: orderFeesList          }).then(res => {            if (res.data.code == 200) {              this.$message.success(this.form.id ? "修改成功" : "提交成功");              this.form = res.data.data;              this.data = res.data.data.orderItemsList;              this.orderFeesList = res.data.data.orderFeesList;              this.oldform = res.data.data;              this.olddata = this.deepClone(res.data.data.orderItemsList);              this.oldorderFeesList = this.deepClone(                res.data.data.orderFeesList              );              if (status == "goBack") {                this.$emit("goBack");              }            }          });        } else {          return false;        }      });    },    //返回列表    backToList() {      let orderFeesList = this.$refs.feeInfo.submitData();      if (        contrastObj(this.form, this.oldform) ||        contrastList(this.data, this.olddata) ||        contrastList(orderFeesList, this.oldorderFeesList)      ) {        this.$confirm("数据发生变化未有提交记录, 是否提交?", "提示", {          confirmButtonText: "确定",          cancelButtonText: "取消",          type: "warning"        })          .then(() => {            this.editCustomer("goBack");          })          .catch(() => {            this.$emit("goBack");          });      } else {        this.$emit("goBack");      }    },    openReport() {      this.switchDialog = !this.switchDialog;    },    onClose(val) {      this.switchDialog = val;    }  }};</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>
 |