Bladeren bron

Merge branch 'develop' of http://code.dashoo.cn/chengjian/opms_frontend into develop

lai 2 jaren geleden
bovenliggende
commit
e15cf617f1

+ 21 - 0
src/views/contract/components/DetailsInvoice.vue

@@ -56,6 +56,12 @@
           <span v-else-if="item.prop == 'actualInvoiceDate'">
             {{ parseTime(row.actualInvoiceDate, '{y}-{m}-{d}') }}
           </span>
+          <span v-else-if="item.prop == 'address'">
+            {{ row.address + '、' + row.phone }}
+          </span>
+          <span v-else-if="item.prop == 'bank'">
+            {{ row.bank + '、' + row.accountNo }}
+          </span>
           <span v-else-if="item.prop == 'invoiceAmount'">
             {{ formatPrice(row.invoiceAmount) }}
           </span>
@@ -133,6 +139,21 @@
             width: 'auto',
             prop: 'courierCode',
           },
+          {
+            label: '税号',
+            width: 'auto',
+            prop: 'taxNo',
+          },
+          {
+            label: '地址、电话',
+            width: 'auto',
+            prop: 'address',
+          },
+          {
+            label: '开户行、账号',
+            width: 'auto',
+            prop: 'bank',
+          },
           {
             label: '审核状态',
             prop: 'approStatus',

+ 54 - 1
src/views/contract/components/EditInvoice.vue

@@ -17,7 +17,11 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="开票金额" prop="invoiceAmount">
-            <el-input v-model.number="editForm.invoiceAmount" clearable placeholder="请输入开票金额" />
+            <el-input
+              v-model="editForm.invoiceAmount"
+              clearable
+              placeholder="请输入开票金额"
+              @input="formatNum(editForm.invoiceAmount, 'invoiceAmount')" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -40,6 +44,37 @@
           </el-form-item>
         </el-col>
       </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="税号" prop="taxNo">
+            <el-input v-model="editForm.taxNo" placeholder="请输入税号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="地址" prop="address">
+            <el-input v-model="editForm.address" placeholder="请输入地址" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="电话" prop="phone">
+            <el-input v-model="editForm.phone" placeholder="请输入电话" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="开户行" prop="bank">
+            <el-input v-model="editForm.bank" placeholder="请输入开户行" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="账号" prop="accountNo">
+            <el-input v-model="editForm.accountNo" placeholder="请输入账号" />
+          </el-form-item>
+        </el-col>
+      </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="备注" prop="remark">
@@ -80,6 +115,11 @@
           contractId: null, //合同id
           invoiceAmount: '', //开票金额
           invoiceType: '', //开票类型
+          taxNo: '', // 税号
+          address: '', // 地址
+          phone: '', // 电话
+          bank: '', // 开户行
+          accountNo: '', // 账号
           remark: '', //备注
         },
         editRules: {
@@ -87,11 +127,24 @@
           invoiceAmount: [{ required: true, trigger: 'blur', message: '请输入开票金额' }],
           invoiceDate: [{ required: true, trigger: 'change', message: '请选择开票日期' }],
           invoiceType: [{ required: true, trigger: 'chgange', message: '请输入开票类型' }],
+          taxNo: [{ required: true, trigger: 'blur', message: '请输入税号' }],
+          address: [{ required: true, trigger: 'blur', message: '请输入地址' }],
+          phone: [{ required: true, trigger: 'blur', message: '请输入电话' }],
         },
       }
     },
     mounted() {},
     methods: {
+      formatNum(val, key) {
+        let temp = val.toString()
+        temp = temp.replace(/。/g, '.')
+        temp = temp.replace(/[^\d.]/g, '') //清除"数字"和"."以外的字符
+        temp = temp.replace(/^\./g, '') //验证第一个字符是数字
+        temp = temp.replace(/\.{2,}/g, '') //只保留第一个, 清除多余的
+        temp = temp.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
+        temp = temp.replace(/^(-)*(\d+)\.(\d\d).*$/, '$1$2.$3') //只能输入两个小数
+        this.editForm[key] = temp
+      },
       async init(id) {
         if (!id) {
           this.title = '新建发票'

+ 15 - 1
src/views/contract/components/EditPlan.vue

@@ -17,7 +17,11 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="计划回款金额" prop="planAmount">
-            <el-input v-model.number="editForm.planAmount" clearable placeholder="请输入计划回款金额" />
+            <el-input
+              v-model="editForm.planAmount"
+              clearable
+              placeholder="请输入计划回款金额"
+              @input="formatNum(editForm.planAmount, 'planAmount')" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -101,6 +105,16 @@
     },
     mounted() {},
     methods: {
+      formatNum(val, key) {
+        let temp = val.toString()
+        temp = temp.replace(/。/g, '.')
+        temp = temp.replace(/[^\d.]/g, '') //清除"数字"和"."以外的字符
+        temp = temp.replace(/^\./g, '') //验证第一个字符是数字
+        temp = temp.replace(/\.{2,}/g, '') //只保留第一个, 清除多余的
+        temp = temp.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
+        temp = temp.replace(/^(-)*(\d+)\.(\d\d).*$/, '$1$2.$3') //只能输入两个小数
+        this.editForm[key] = temp
+      },
       async init(id) {
         if (!id) {
           this.title = '新建回款计划'

+ 3 - 0
src/views/contract/components/Invoicing.vue

@@ -68,6 +68,9 @@
           invoiceCode: [{ required: true, trigger: 'blur', message: '请输入发票号码' }],
           actualInvoiceDate: [{ required: true, trigger: 'change', message: '请选择实际开票日期' }],
           courierCode: [{ required: true, trigger: 'blur', message: '请输入快递单号' }],
+          taxNo: [{ required: true, trigger: 'blur', message: '请输入税号' }],
+          address: [{ required: true, trigger: 'blur', message: '请输入地址' }],
+          phone: [{ required: true, trigger: 'blur', message: '请输入电话' }],
         },
       }
     },

+ 22 - 1
src/views/contract/invoice.vue

@@ -50,7 +50,7 @@
         :sortable="item.sortable">
         <template #default="{ row }">
           <span v-if="item.prop == 'invoiceType'">
-            {{ selectDictLabel(invoiceTypeData, row.collectionType) }}
+            {{ selectDictLabel(invoiceTypeData, row.invoiceType) }}
           </span>
           <span v-else-if="item.prop == 'approStatus'">
             {{
@@ -74,6 +74,12 @@
           <span v-else-if="item.prop == 'actualInvoiceDate'">
             {{ parseTime(row.actualInvoiceDate, '{y}-{m}-{d}') }}
           </span>
+          <span v-else-if="item.prop == 'address'">
+            {{ row.address + '、' + row.phone }}
+          </span>
+          <span v-else-if="item.prop == 'bank'">
+            {{ row.bank + '、' + row.accountNo }}
+          </span>
           <span v-else-if="item.prop == 'invoiceAmount'">
             {{ formatPrice(row.invoiceAmount) }}
           </span>
@@ -184,6 +190,21 @@
             width: 'auto',
             prop: 'courierCode',
           },
+          {
+            label: '税号',
+            width: 'auto',
+            prop: 'taxNo',
+          },
+          {
+            label: '地址、电话',
+            width: 'auto',
+            prop: 'address',
+          },
+          {
+            label: '开户行、账号',
+            width: 'auto',
+            prop: 'bank',
+          },
           {
             label: '审核状态',
             prop: 'approStatus',

+ 46 - 1
src/views/work/deliver/components/completeProgress.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px">
+  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="750px">
     <el-form ref="form" label-position="top" :model="form" :rules="rules">
       <el-row :gutter="20">
         <el-col :span="24">
@@ -29,6 +29,16 @@
               value-format="yyyy-MM-dd HH:mm:ss" />
           </el-form-item>
         </el-col>
+        <el-col v-if="progress.progressType == '30'" :span="24">
+          <el-form-item label="产品">
+            <el-table ref="productTable" :data="products" style="width: 100%">
+              <el-table-column type="selection" width="55" />
+              <el-table-column label="产品名称" prop="productName" />
+              <el-table-column label="产品编号" prop="productCode" />
+              <el-table-column label="数量" prop="productNum" />
+            </el-table>
+          </el-form-item>
+        </el-col>
         <el-col :span="24">
           <el-form-item label="备注" prop="remark">
             <el-input v-model="form.remark" placeholder="请输入备注" :rows="5" show-word-limit type="textarea" />
@@ -45,6 +55,7 @@
 
 <script>
   import deliverWorkApi from '@/api/work/deliverWork'
+  import orderWorkApi from '@/api/work/deliver'
   import to from 'await-to-js'
   import axios from 'axios'
   import asyncUploadFile from '@/utils/uploadajax'
@@ -60,6 +71,7 @@
     },
     data() {
       return {
+        products: [],
         form: {
           date: '',
           fileUrl: '',
@@ -102,8 +114,23 @@
         if (this.$refs.uploadRef) {
           this.$refs.uploadRef.clearFiles() //去掉文件列表
         }
+        this.getProgressProducts()
         this.dialogFormVisible = true
       },
+      // 获取产品
+      async getProgressProducts() {
+        let temp = []
+        const [err, res] = await to(orderWorkApi.getDeliverOrder({ id: this.progress.deliverOrderId }))
+        if (err) return
+        if (res.code == 200 && res.data && res.data.progressProducts) {
+          for (let item of res.data.progressProducts) {
+            if (item.installProgressId == this.progress.id) {
+              temp.push(item)
+            }
+          }
+        }
+        this.products = temp
+      },
       // 上传附件
       beforeAvatarUpload(file) {
         let flag1 = file.size < this.fileSettings.fileSize
@@ -187,6 +214,22 @@
                 this.$emit('fetch-data')
               }
             } else if (this.progress.progressType == '30') {
+              if (!this.$refs.productTable.selection || this.$refs.productTable.selection == 0) {
+                this.$baseMessage('未选中任何产品', 'error', 'vab-hey-message-error')
+                return
+              }
+              let idMap = {}
+              let idArr = []
+              let unIdArr = []
+              for (let item of this.$refs.productTable.selection) {
+                idMap[item.id] = item.id
+                idArr.push(item.id)
+              }
+              for (let item of this.products) {
+                if (!idMap[item.id]) {
+                  unIdArr.push(item.id)
+                }
+              }
               const [err, res] = await to(
                 deliverWorkApi.completeInstall({
                   id: this.progress.id,
@@ -194,6 +237,8 @@
                   installCheckFileUrl: this.form.fileUrl,
                   fileName: this.form.fileName,
                   remark: this.form.remark,
+                  installProductIdArr: idArr,
+                  uninstallProductIdArr: unIdArr,
                 })
               )
               if (err) return

+ 24 - 3
src/views/work/deliver/components/editWork.vue

@@ -272,13 +272,13 @@
                 const { msg } = await deliverWorkApi.startDeliverGoodsProgress(data)
                 this.$baseMessage(msg, 'success', 'vab-hey-message-success')
               } else if (params.progressType == '30') {
-                if (!this.$refs.productTable.selection || this.$refs.productTable.selection == 0) {
-                  this.$baseMessage('未选中任何产品', 'error', 'vab-hey-message-error')
+                if (this.products.length == 0) {
+                  this.$baseMessage('无可操作产品,操作失败', 'error', 'vab-hey-message-error')
                   return
                 }
                 let data = {
                   progress: params,
-                  products: this.$refs.productTable.selection,
+                  products: this.products,
                 }
                 const { msg } = await deliverWorkApi.startInstallProgress(data)
                 this.$baseMessage(msg, 'success', 'vab-hey-message-success')
@@ -367,6 +367,25 @@
             this.form.progressTitle =
               '[' + res.data.contractCode + '][' + res.data.projectName + ']发货任务单-' + res.data.number
           }
+        } else if (this.form.progressType == '30' && this.workId == 0) {
+          // 1052, "于洋"
+          this.form.principalPersonId = 1052
+          this.form.principalPerson = '于洋'
+          orderWorkApi
+            .getHardwareUserInfo({ name: '于洋' })
+            .then((res) => {
+              if (res.data) {
+                this.form.principalPersonId = res.data.id
+                this.form.principalPerson = res.data.nickName
+              }
+            })
+            .catch((err) => {
+              console.error(err)
+            })
+          if (!this.form.progressTitle) {
+            this.form.progressTitle =
+              '[' + res.data.contractCode + '][' + res.data.projectName + ']安装任务单-' + res.data.number2
+          }
         }
         for (let p of this.allProducts) {
           p.max = p.productNum - p.completeNum
@@ -398,6 +417,8 @@
           if (this.form.progressType == '10') {
             this.productEditable = true
             this.products = this.deliverProducts
+          } else if (this.form.progressType == '30') {
+            this.products = this.selfProducts
           }
         }
       },

+ 5 - 0
src/views/work/deliver/index.vue

@@ -174,6 +174,11 @@
             width: '280px',
             prop: 'contractCode',
           },
+          {
+            label: '合同签订单位',
+            width: '280px',
+            prop: 'signatoryUnit',
+          },
           {
             label: '交付状态',
             width: '100px',

+ 30 - 4
src/views/work/deliver/plan.vue

@@ -100,14 +100,19 @@
               @click="openAddWork('10')">
               生成发货任务单
             </el-button>
-            <!-- <el-button
-              v-show="workOrderStatus == 15 && curPlanStatus != 30 && orderType == '20'"
-              v-permissions="['order:delivery:work:addinstall']"
+            <el-button
+              v-show="
+                workOrderStatus == 15 &&
+                curPlanStatus != 30 &&
+                orderType == '20' &&
+                userId == saleId &&
+                canInstallProgress
+              "
               icon="el-icon-plus"
               type="primary"
               @click="openAddWork('30')">
               生成部署安装单
-            </el-button> -->
+            </el-button>
           </vab-query-form-left-panel>
           <vab-query-form-right-panel>
             <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="deliveryPlanTable" />
@@ -358,6 +363,7 @@
     },
     data() {
       return {
+        canInstallProgress: false,
         orderType: '',
         saleId: '',
         planList: [], //左侧工单列表
@@ -488,8 +494,27 @@
       this.id = parseInt(this.$route.query.id)
       await this.getOrderDetails()
       this.fetchPlanList()
+      this.getInstallProgress()
     },
     methods: {
+      // 获取安装单的数量
+      async getInstallProgress() {
+        this.canInstallProgress = false
+        const [err, res] = await to(
+          deliverWorkApi.list({ progressType: '30', pageNum: 1, pageSize: 9999, deliverOrderId: this.id })
+        )
+        if (err) return
+        if (res.code == 200 && res.data) {
+          if (res.data.total != 0) {
+            this.canInstallProgress = true
+            for (let item of res.data.list) {
+              if (item.progressStatus == '10' || item.progressStatus == '15' || item.progressStatus == '20') {
+                this.canInstallProgress = false
+              }
+            }
+          }
+        }
+      },
       // 返回
       back() {
         this.$router.push({
@@ -703,6 +728,7 @@
           this.tabaleList = res.data.list
           this.total = res.data.total
         }
+        this.getInstallProgress()
       },
     },
   }

+ 1 - 1
src/views/work/order/components/FeedbackRecord.vue

@@ -1,5 +1,5 @@
 <template>
-  <div style="height: 100%">
+  <div style="height: 100%; overflow: auto">
     <div v-if="type == 'try'">
       <el-table border :data="detail.feedbackTrail">
         <el-table-column