| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740 | <template>  <div class="borderless" v-loading="pageLoading">    <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" :loading="btnLoading">返回列表</el-button>      </div>      <div class="add-customer-btn">        <el-button type="primary" size="small" class="el-button--small-yh" @click.stop="openEdit" v-if="disabled">编 辑        </el-button>        <el-button v-if="checker && form.status != 3" type="primary" size="small" class="el-button--small-yh"          @click.stop="openCheckDialog">          审批        </el-button>        <el-button v-if="form.status > 0" @click.native="checkScheduleDialog = true, checkId = form.id" type="primary"          size="small">审核进度</el-button>        <el-button type="primary" v-if="!checkDisabled" :disabled="!form.id || disabled" size="small"          @click="pleaseCheck" :loading="btnLoading">请核</el-button>        <el-button type="success" :disabled="!form.id" size="small" @click="copyDoc" :loading="btnLoading" v-if="false">          复制单据</el-button>        <el-button type="primary" @click="editCustomer" size="small" :disabled="form.status > 0" :loading="btnLoading">          保存数据</el-button>      </div>    </div>    <div class="customer-main">      <trade-card title="经办人信息">        <avue-form ref="form" class="trading-form" v-model="form" :option="option">          <template slot="userId">            <el-select v-model="form.userId" filterable clearable size="small" placeholder="请选择" @change="userHandle"                       @clear="form.userName == null" :disabled="disabled || checkDisabled">              <el-option v-for="(item, index) in userList" :key="index" :label="item.realName" :value="item.id">              </el-option>            </el-select>          </template>          <template slot="belongToCorpId">            <crop-select                v-model="form.belongToCorpId"                corpType="GS"                :disabled="disabled || checkDisabled"                @getCorpData="returnBack"                style="width: 100%"                ref="KHSelect"            ></crop-select>          </template>          <template slot="deptId">            <avue-input-tree leaf-only style="width: 100%;" size="small" :props="{ label: 'title' }"                             v-model="form.deptId" placeholder=" " type="tree" :dic="dic" :nodeClick="deptClick"                             :disabled="disabled || checkDisabled"></avue-input-tree>          </template>          <template slot="postId">            <el-select v-model="form.postId" clearable filterable placeholder="请选择 岗位" @change="postHandle"                       @clear="form.postId == null" :disabled="disabled || checkDisabled">              <el-option v-for="(item, index) in postDic" :label="item.postName" :value="item.id" :key="index" />            </el-select>          </template>        </avue-form>      </trade-card>      <trade-card title="报销明细">        <avue-crud ref="crud" :key="key" :data="dataList" :option="tableOption" :cell-style="cellStyle" @saveColumn="saveColumn"                   @resetColumn="resetColumn">          <template slot="menuLeft">            <el-button type="primary" icon="el-icon-plus" size="small" @click.stop="newDetails"                       :disabled="disabled || checkDisabled">录入明细</el-button>            <el-button type="info" icon="el-icon-printer" size="small" @click="openReport">报表打印</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 || checkDisabled">{{ row.$cellEdit ? "保存" : "修改" }}</el-button>            <el-button size="small" icon="el-icon-delete" type="text" @click="rowDel(row, index)"                       :disabled="disabled || checkDisabled">删除</el-button>          </template>          <template slot="payDate" slot-scope="{ row, index }">            <el-date-picker v-if="row.$cellEdit" v-model="row.payDate" type="date" placeholder="选择日期" size="small"                            style="width: 100%" format="yyyy-MM-dd" valueFormat="yyyy-MM-dd"></el-date-picker>            <span v-else>{{ row.payDate }}</span>          </template>          <template slot="moldId" slot-scope="{ row }">            <avue-cascader v-if="row.$cellEdit" v-model="row.moldId" size="small" style="width: 100%;" :dic="dicArea"                           :props="props" check-strictly :emit-path="false" :show-all-levels="false"                           @change="moldChange($event, row, dicArea)" @clear="row.feeList = feesOption" placeholder="请选择">            </avue-cascader>            <span v-else>{{ row.mold }}</span>          </template>          <template slot="detailId" slot-scope="{ row }">            <el-select v-if="row.$cellEdit" v-model="row.detailId" filterable clearable @change="detailChange(row)"                       size="small">              <el-option v-for="(item, index) in row.feeList" :key="index" :label="item.cname" :value="item.id">              </el-option>            </el-select>            <span v-else>{{ row.detail }}</span>          </template>          <template slot="explanation" slot-scope="{ row, index }">            <el-input v-if="row.$cellEdit" v-model="row.explanation" size="small" placeholder="输入内容" />            <span v-else>{{ row.explanation }}</span>          </template>          <template slot="payMethod" slot-scope="{ row, index }">            <el-select v-model="row.payMethod" size="small" placeholder="请选择" clearable :disabled="!row.$cellEdit">              <el-option v-for="(item, index) in paymentOption" :key="index" :label="item.dictValue"                         :value="item.dictKey"></el-option>            </el-select>          </template>          <template slot="amount" slot-scope="{ row, index }">            <el-input-number v-if="row.$cellEdit" v-model="row.amount" size="small" :controls="false" :precision="2"                             style="width: 100%" placeholder="金额"></el-input-number>            <span v-else>{{ row.amount }}</span>          </template>        </avue-crud>      </trade-card>      <trade-card title="上传附件">        <c-upload :basic="true"                  :enumerationValue="107.1"                  :disabled="disabled || checkDisabled"                  :data="fileList"></c-upload>      </trade-card>      <trade-card title="付款信息">        <avue-form :option="optionTwo" v-model="form">          <template slot="paymentMethodName" slot-scope="{ row, index }">            <el-select v-model="form.paymentMethodName" filterable size="small" placeholder="请选择" clearable>              <el-option v-for="(item, index) in paymentOption" :key="index" :label="item.dictValue"                         :value="item.dictKey"></el-option>            </el-select>          </template>        </avue-form>      </trade-card>    </div>    <el-dialog append-to-body title="审批" class="el-dialogDeep" :visible.sync="checkDialog" width="50%"      :close-on-click-modal="false" :destroy-on-close="true" :close-on-press-escape="false" v-dialog-drag>      <check :checkData="checkData" :checkDetail="false" :idList="[]" @choceCheckFun="choceCheckFun">      </check>    </el-dialog>    <el-dialog append-to-body title="审批进度" class="el-dialogDeep" :visible.sync="checkScheduleDialog" width="40%"      :close-on-click-modal="false" :destroy-on-close="true" :close-on-press-escape="false" v-dialog-drag>      <check-schedule :checkId="checkId" :batchNo="batchNo" @choceScheduleFun="choceScheduleFun">      </check-schedule>    </el-dialog>    <!--    报表-->    <report-dialog :switchDialog="switchDialog" :reportId="form.id" reportName="事务-报销单" @onClose="onClose()" />  </div></template><script>import tableOption from "./config/customerContact.json";import tableOptionTwo from "./config/customerContactTwo.json";import {  isDiscount,  isPercentage,  micrometerFormat,  IntegerFormat} from "@/util/validate";import {gainUser, getCharge} from "@/api/basicData/customerInquiry";import { getUserInfo } from "@/api/system/user";import { getDeptTree } from "@/api/system/dept";import { getCurrentDate } from "@/util/date";import { getList as getPostList } from "@/api/system/post";import { dataDetail, typeSave, removeGoods, pleaseCheck } from "@/api/standAlone/reimbursement";import { contrastObj, contrastList } from "@/util/contrastData";import check from "@/components/check/check";import checkSchedule from "@/components/check/checkSchedule";import reportDialog from "@/components/report-dialog/main";import { getDeptTree as getFeesId, getFeesList } from "@/api/basicData/basicFeesDesc";import {customerList as getKHList, detail as khDetail} from "@/api/basicData/customerInformation";import {getCorpDetail} from "@/api/maintenance/overpayment";import {integralDetail} from "@/api/maintenance/integral";import {getlistBankBy, getProfit} from "@/api/basicData/configuration";import da from "element-ui/src/locale/lang/da";export default {  name: "detail",  props: {    detailData: {      type: Object    }  },  components: {    check,    checkSchedule,    reportDialog  },  data() {    return {      disabled: false,      pageLoading: false,      btnLoading: false,      form: {},      option: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "申请报销人",            prop: "userId",            rules: [              {                required: true,                message: " ",                trigger: "change"              }            ],            span: 8,            slot: true,          },          {            label: "提交时间",            prop: "claimDate",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd HH:mm:ss",            rules: [              {                required: true,                message: " ",                trigger: "blur"              }            ]          },          {            label: "要求支付日期",            prop: "requiredPaymentTime",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd HH:mm:ss"          },          {            label: "所属公司",            prop: "belongToCorpId",            span: 16,            slot: true,          },          {            label: "所属部门",            prop: "deptId",            rules: [              {                required: true,                message: " ",                trigger: "blur"              }            ],            span: 8,            slot: true,          },          {            label: "所属公司编码",            prop: "belongToCorpCode",            span: 8,            slot: true,          },          {            label: "报销人银行户头",            prop: "accountReimbursement",            type: 'select',            dicData:[],            filterable:true,            props: {              label: "accountName",              value: "accountName"            },            change:(data)=>{              let list = this.findObject(this.option.column, "accountReimbursement").dicData              for (let item of list){                if (data.value == item.accountName){                  this.form.accountReimbursement = data.value                  this.form.reimbursementAccountNo = item.accountBank                  this.form.bankOfDeposit = item.accountNo                }              }            },            span: 8,            slot: true,          },          {            label: "报销人账号",            prop: "reimbursementAccountNo",            span: 8,            slot: true,          },          {            label: "报销人开户行",            prop: "bankOfDeposit",            span: 8,            slot: true,          },          {            label: "系统编号",            prop: "serialNo",            disabled:true,            span: 8,            slot: true,          },          {            label: "单据数量",            prop: "billQuantity",            span: 8,            slot: true,          },          {            label: "备注",            prop: "remarks",            type: "textarea",            minRows: 2,            span: 24,          },        ],      },      optionTwo: {        menuBtn: false,        labelWidth: 100,        column: [          {            label: "支付时间",            prop: "paymentTime",            span: 8,            type: "date",            format: "yyyy-MM-dd",            valueFormat: "yyyy-MM-dd HH:mm:ss"          },          {            label: "支付方式",            prop: "paymentMethodName",            type: "select",            dicUrl: "/api/blade-system/dict-biz/dictionary?code=payment_term",            props: {              label: "dictValue",              value: "dictKey"            },            span: 8,            slot: true,          },{            label: "实际付款金额",            prop: "paymentAmount",            span: 8,            slot: true,          },{            label: "给付人",            prop: "dans",            span: 8,            slot: true,          },{            label: "财务出纳",            prop: "financialCashier",            span: 8,            slot: true,          },{            label: "科目编码",            prop: "subjectCode",            span: 8,            slot: true,          },        ]      },      dataList: [],      tableOption: {},      goodsoptions: [],      unitOption: [],      paymentOption: [],      fileList:[],      selectionList: [],      search: {},      treeStyle: "height:" + (window.innerHeight - 315) + "px",      goodsOption: {},      loading: false,      switchDialog: false, // 报表弹窗控制      userList: [],      dic: [], // 部门      postDic: [], // 岗位      loginUser: '', // 登录人      breakConfiguration: {        multipleChoices: false,        multiple: false,        disabled: false,        searchShow: true,        collapseTags: false,        clearable: true,        placeholder: "请点击右边按钮选择",        dicData: []      },      oldForm: {},      oldDataList: [],      checkDisabled: false, // 审核状态      checker: false,      checkId: '',      batchNo: '',      checkDialog: false,      checkScheduleDialog: false,      checkData: {},      dicArea: [],      props: {        value: 'value',        label: 'title',      },      feesOption: [],      tableOptionBack:{},      key:0,      tenantId:JSON.parse(localStorage.getItem("saber-userInfo")).content.tenant_id    }  },  async created() {    if (this.tenantId == '681169'){      this.tableOptionBack = tableOptionTwo    }else {      this.tableOptionBack = tableOption    }    this.$set(this.form, 'claimDate', getCurrentDate()); // 默认当前日期    this.tableOption = await this.getColumnData(this.getColumnName(107),this.tableOptionBack);    this.key++    gainUser().then(res => {      this.userList = res.data.data;    });    getUserInfo().then(res => {      this.$set(this.form, 'userId', res.data.data.id);      this.$set(this.form, 'userName', res.data.data.realName);      this.$set(this.form, 'deptId', res.data.data.deptId);      this.$set(this.form, 'deptName', res.data.data.deptName);      this.$set(this.form, 'postId', res.data.data.postId.split(',')[0]);      this.$set(this.form, 'postName', res.data.data.postName.split(',')[0]);      this.loginUser = res.data.data.realName;    })    getDeptTree().then(res => {      this.dic = res.data.data    })    getPostList(1, 10).then(res => {      if (res.data.data.total > 0) {        this.postDic = res.data.data.records;        if (Math.ceil(res.data.data.total / 10) > 1) {          for (let i = 2; i <= Math.ceil(res.data.data.total / 10); i++) {            getPostList(i, 10).then(e => {              this.postDic = this.postDic.concat(e.data.data.records);            });          }        }      }    });    getFeesId().then(res => {      this.dicArea = res.data.data;    })    getFeesList().then(res => {      this.feesOption = res.data.data;    });    this.getWorkDicts('unit').then(res => {      this.unitOption = res.data.data;    })    this.getWorkDicts("payment_term").then(res => {      this.paymentOption = res.data.data;    })    if (this.detailData.query) {      this.disabled = true;      this.option.column.map(e => {        this.$set(e, 'disabled', true)      })      this.optionTwo.column.map(e => {        this.$set(e, 'disabled', true)      })      this.queryData(this.detailData.id);    } else if (this.detailData.auditId) {      this.checker = true;      this.batchNo = this.detailData.check.batchNo      this.queryData(this.detailData.id);    }  },  filters: {    IntegerFormat(num) {      return IntegerFormat(num);    },    decimalFormat(num) {      return num ? Number(num).toFixed(2) : "0.00";    }  },  methods: {    returnBack(row) {      getlistBankBy(row.id).then(res =>{        this.findObject(this.option.column, "accountReimbursement").dicData = res.data      })    },    // 查询    queryData(id) {      this.pageLoading = true;      dataDetail({ id: id }).then(res => {        this.form = res.data.data;        this.fileList = this.form.fileList        delete this.form.fileList        this.dataList = this.form.itemList ? this.form.itemList : [];        this.dataList.forEach(item => {          this.moldChange(item.moldId, item, this.dicArea)          if (item.payMethod) {            item.payMethod = item.payMethod.toString();          }        })        delete this.form.itemList;        this.oldForm =this.deepClone({ ...this.form });        this.oldDataList =this.deepClone([...this.dataList]);        this.checkDisabled = this.form.status > 0 ? true : false;        if (this.form.status > 0) {          this.option.column.map(e => {            this.$set(e, 'disabled', true)          })          this.optionTwo.column.map(e => {            this.$set(e, 'disabled', true)          })        }      }).finally(() => {        this.pageLoading = false;      })    },    //返回列表    backToList() {      this.$emit("goBack");    },    // 编辑按钮触发    openEdit() {      this.disabled = false;      this.option.column.map(e => {        if (this.checkDisabled) {          this.$set(e, 'disabled', true)        } else {          if (e.prop != 'serialNo') {            this.$set(e, 'disabled', false)          }        }      })      this.optionTwo.column.map(e => {        if (this.checkDisabled) {          this.$set(e, 'disabled', true)        } else {          if (e.prop != 'serialNo') {            this.$set(e, 'disabled', false)          }        }      })    },    // 复制    copyDoc() {      this.$emit("copyOrder", this.form.id);    },    //修改提交触发    editCustomer(status) {      for (let i = 0; i < this.dataList.length; i++) {        if (this.dataList[i].amount == null) {          return this.$message.error("报销明细第" + Number(i + 1) + "行的金额不能为空");        }      }      this.$refs["form"].validate((valid, done) => {        done();        if (valid) {          this.$set(this.form, 'itemList', this.dataList)          let formTwo = {            ...this.form,            fileList:this.fileList          }          this.btnLoading = true;          typeSave(formTwo).then(res => {            this.$message({ type: "success", message: this.form.id ? "修改成功!" : "新增成功!" });            this.queryData(res.data.data);          }).finally(() => {            this.btnLoading = false;          })        } else {          return false        }      })    },    cellStyle() {      return "padding:0;height:40px;";    },    async saveColumn() {      const inSave = await this.saveColumnData(        this.getColumnName(107),        this.tableOption      );      if (inSave) {        this.$message.success("保存成功");        //关闭窗口        this.$refs.crud.$refs.dialogColumn.columnBox = false;        this.$nextTick(() => {          this.$refs.crud.doLayout()        })      }    },    async resetColumn() {      this.tableOption = this.tableOptionBack;      const inSave = await this.delColumnData(        this.getColumnName(107),this.tableOptionBack      );      if (inSave) {        this.$nextTick(() => {          this.$refs.crud.doLayout()        })        this.$message.success("重置成功");        //关闭窗口        setTimeout(() => {          this.$refs.crud.$refs.dialogColumn.columnBox = false;        }, 1000);      }    },    //录入明细    newDetails() {      this.$refs["form"].validate((valid, done) => {        done()        if (valid) {          this.dataList.push({            $cellEdit: true,            feeList: this.feesOption,          })        }      })    },    rowCell(row, index) {      if (row.$cellEdit == true) {        this.$set(row, "$cellEdit", false);      } else {        this.$set(row, "$cellEdit", true);      }    },    rowDel(row, index) {      this.$confirm("确定删除数据?", {        confirmButtonText: "确定",        cancelButtonText: "取消",        type: "warning"      }).then(() => {        if (row.id) {          removeGoods(row.id).then(res => {            this.$message({              type: 'success',              message: '删除成功!'            })            this.dataList.splice(row.$index, 1);          })        } else {          this.$message({            type: "success",            message: "删除成功!"          });          this.dataList.splice(row.$index, 1);        }      });    },    getKHData(row) { },    //选择费用    selectValue(value, row) {      console.log(value)      this.$set(row, "expenseItem", value.cname);    },    userHandle() {      this.form.userName = this.userList.find(item => item.id == this.form.userId).realName;    },    postHandle() {      this.form.postName = this.postDic.find(item => item.id == this.form.postId).postName;    },    // 验证新旧值对比    verification() {      if (contrastObj(this.form, this.oldForm) ||        contrastList(this.dataList, this.oldDataList)) {        this.$confirm("数据发生变化未有提交记录, 是否提交?", "提示", {          confirmButtonText: "确定",          cancelButtonText: "取消",          type: "warning"        }).then(() => {          this.editCustomer();        }).catch(() => {          return false;   //取消改动数据        })      } else {        return true;      }    },    deptClick(data) {      this.$set(this.form, 'deptName', data.title)    },    //打开审核    openCheckDialog() {      this.checkData = this.detailData.check      this.checkDialog = true;    },    //关闭审核    choceCheckFun() {      this.checkDialog = false;    },    choceScheduleFun() {      this.checkScheduleDialog = false    },    // 请核    pleaseCheck() {      if (this.verification()) {        const data = {          id: this.form.id,          serialNo: this.form.serialNo,          checkType: 'fybx',          url: '/reimbursement/index',          pageStatus: "this.$store.getters.reimbursementStatus",          pageLabel: "报销",          checkFlag: 1,        }        this.btnLoading = true;        pleaseCheck(data).then(res => {          this.$message.success('请核成功')          this.queryData(this.form.id)        }).catch(() => {          this.$message.error('请核失败')        }).finally(() => {          this.btnLoading = false;        })      }    },    // 报表    openReport() {      this.switchDialog = !this.switchDialog;    },    // 报表关闭    onClose(val) {      this.switchDialog = val;    },    moldChange(e, row, list) {      list.forEach(item => {        if (e == item.value) {          this.$set(row, 'mold', item.title);          getFeesList({ feesTypeId: e }).then(res => {            this.$set(row, 'feeList', res.data.data);            this.$nextTick(() => {              if (!(row.feeList.some(item => item.id == row.detailId))) {                this.$set(row, 'detailId', null);              }            })          });        }        if (item.hasChildren) {          this.moldChange(e, row, item.children)        }      })    },    detailChange(row) {      row.detail = row.feeList.find(item => item.id == row.detailId) ? row.feeList.find(item => item.id == row.detailId).cname : null    },  },}</script><style scoped></style>
 |