浏览代码

散件入库修改

lilei 2 年之前
父节点
当前提交
c3d6913685

+ 25 - 1
src/api/spareParts.js

@@ -24,11 +24,35 @@ export const sparePartsDetailExport = (params) => {
 // 审核
 export const sparePartsAudit = (params) => {
   return axios({
-    url: `/spareParts/audit`,
+    url: `/spareParts/audit/${params.sn}`,
+    method: 'get'
+  })
+}
+// 批量审核
+export const sparePartsBatchAudit = (params) => {
+  return axios({
+    url: `/spareParts/batchAudit`,
+    data: params,
+    method: 'post'
+  })
+}
+// 多审核校验
+export const sparePartsAuditVerify = (params) => {
+  return axios({
+    url: `/spareParts/auditVerify`,
     data: params,
     method: 'post'
   })
 }
+// 导出审核错误项
+export const sparePartsAuditFail = (params) => {
+  return axios({
+    url: `/spareParts/downloadAuditFail`,
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
 
 // 删除
 export const sparePartsDelete = (params) => {

+ 96 - 0
src/views/purchasingManagement/bulkWarehousingOrder/auditNoPassModal.vue

@@ -0,0 +1,96 @@
+<template>
+  <a-modal
+    centered
+    class="bulkWarehousingOrder-auditNo-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="提示"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="960">
+    <a-card size="small" :bordered="false" class="bulkWarehousingOrderDetail-cont">
+      <!-- 总计 -->
+      <a-alert style="margin-bottom:10px" type="error" message="对不起,审核失败! OCS和金蝶上产品成本不一致。请确保成本价格一致后再进行审核。" />
+      <!-- 列表 -->
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :dataSource="list"
+        :scroll="{ y: 400 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+    </a-card>
+    <div class="btn-cont">
+      <a-button id="bulkWarehousingOrder-auditNo-modal-back" @click="isShow = false" style="margin-left: 15px;">返回列表</a-button>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+export default {
+  name: 'auditNoPassModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      list: []
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '产品编码', dataIndex: 'productCode', width: '25%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', width: '40%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+      ]
+      if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
+        arr.splice(5, 0, { title: 'OCS成本价', dataIndex: 'verifyCost', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+        arr.splice(5, 0, { title: '金蝶成本价', dataIndex: 'productCost', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    //  返回列表
+    handleBack () {
+      this.isShow = false
+    },
+    setData(data){
+      this.list = data
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      }
+    },
+  }
+}
+</script>
+
+<style lang="less">
+  .bulkWarehousingOrder-auditNo-modal{
+    .ant-modal-body {
+      padding: 10px 10px 20px;
+    }
+    .btn-cont {
+      text-align: center;
+      margin: 5px 0 10px;
+    }
+  }
+</style>

+ 185 - 0
src/views/purchasingManagement/bulkWarehousingOrder/batchAuditNoModal.vue

@@ -0,0 +1,185 @@
+<template>
+  <a-modal
+    centered
+    class="batchAuditModal-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="批量审核"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="900">
+    <div class="batchAuditModal-con">
+      <!-- 可导入数据 -->
+      <p class="">可审核通过数据{{ loadData.length }}条</p>
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.allocateSn"
+        :columns="nowColumns"
+        :dataSource="loadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <a-divider />
+      <!-- 不可导入数据 -->
+      <p class="red">审核不通过数据{{ unLoadData.length }}条(成本价不一致)</p>
+      <a-table
+        class="unTable"
+        ref="unTable"
+        size="small"
+        :rowKey="(record) => record.errorDesc"
+        :columns="nowUnColumns"
+        :dataSource="unLoadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="batchAuditModal-submit"
+          size="large"
+          :loading="spinning"
+          :class="loadData.length==0?'button-grey':'button-primary'"
+          @click="handleSubmit"
+          style="padding: 0 40px;">确认审批</a-button>
+        <a-button
+          id="batchAuditModal-cancel"
+          size="large"
+          :loading="spinning"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 40px;margin-left: 15px;">取消</a-button>
+        <a-button
+          type="primary"
+          id="batchAuditModal-error"
+          size="large"
+          :loading="spinning"
+          class="button-error"
+          @click="handleError"
+          style="padding: 0 40px;margin-left: 15px;">导出错误项</a-button>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { hdExportExcel } from '@/libs/exportExcel'
+import { sparePartsAuditVerify, sparePartsBatchAudit, sparePartsAuditFail } from '@/api/spareParts'
+export default {
+  name: 'batchAudtiModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      spinning: false,
+      nowColumns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库类型', dataIndex: 'sparePartsTypeDictValue', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '关联单号', dataIndex: 'relationNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '金蝶单号', dataIndex: 'kingdeeNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      loadData: [],
+      nowUnColumns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库类型', dataIndex: 'sparePartsTypeDictValue', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '关联单号', dataIndex: 'relationNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '金蝶单号', dataIndex: 'kingdeeNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      unLoadData: [],
+      loading: false,
+      snList: []
+    }
+  },
+  methods: {
+    getData (data) {
+      if (data.okList && data.okList.length > 0) {
+        data.okList.map((item, index) => {
+          item.no = index + 1
+          this.snList.push(item.sparePartsSn)
+        })
+      }
+      if (data.errList && data.errList.length > 0) {
+        data.errList.map((item, index) => {
+          item.no = index + 1
+        })
+      }
+      this.loadData = data.okList || []
+      this.unLoadData = data.errList || []
+    },
+    // 确认导入
+    handleSubmit () {
+      if (this.loadData.length == 0) {
+        this.$message.warning('没有可审核的数据!')
+      } else {
+        this.spinning = true
+        sparePartsBatchAudit(this.snList).then(res => {
+          if(res.status == 200){
+            this.$emit('ok',res.message)
+            this.isShow = false
+          }
+          this.spinning = false
+        })
+      }
+    },
+    // 导出
+    handleError () {
+      const _this = this
+      if (_this.unLoadData.length < 1) {
+        _this.$message.info('暂无可导出错误项~')
+        return
+      }
+      _this.spinning = true
+      hdExportExcel(sparePartsAuditFail, _this.unLoadData, '散件入库审核错误项', function () {
+        _this.spinning = false
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.loadData = []
+        this.unLoadData = []
+        this.snList = []
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .batchAuditModal-modal{
+    .batchAuditModal-con{
+      .red{
+        color: #f30;
+      }
+      .btn-con{
+        text-align: center;
+        margin: 30px 0 20px;
+        .button-cancel,.button-error{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 7 - 2
src/views/purchasingManagement/bulkWarehousingOrder/edit.vue

@@ -25,7 +25,7 @@
       </a-card>
       <a-card size="small" :bordered="false" class="bulkWarehousingOrderEdit-cont">
         <!-- 操作按钮 -->
-        <div class="table-operator" style="display: flex;">
+        <div class="table-operator" style="display: flex;align-items:center;">
           <div>
             <a-button id="bulkWarehousingOrderEdit-add" type="primary" class="button-primary" @click="handleEdit()">新增产品</a-button>
             <a-button id="bulkWarehousingOrderEdit-import" type="default" class="button-primary" @click="openGuideModal=true">导入产品</a-button>
@@ -84,6 +84,11 @@
               class="button-error"
               id="bulkWarehousingOrderList-del-btn">删除</a-button>
           </template>
+          
+          <template slot="productName" slot-scope="text, record">
+            {{record.productName}}
+            <a-tag color="red" v-if="record.giftFlag==1">赠品</a-tag>
+          </template>
         </s-table>
       </a-card>
     </a-spin>
@@ -151,7 +156,7 @@ export default {
       const arr = [
         { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', width: '25%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '产品名称', scopedSlots: { customRender: 'productName' },width: '25%', align: 'center' },
         { title: '单位', dataIndex: 'unit', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '入库数量', dataIndex: 'productQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         // { title: '入库单价', dataIndex: 'productCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },

+ 3 - 2
src/views/purchasingManagement/bulkWarehousingOrder/importGuideModal.vue

@@ -16,8 +16,9 @@
           </div>
           <ul>
             <li>1) 导入的Excel文件中必须包含名为“产品编码”、“数量”的列,且名称必须相同</li>
-            <li>2) 除了“产品编码”、“数量”两列,其他列可自定义,不影响数据导入</li>
-            <li>3) 如果导入的产品已经存在,则不会导入该行</li>
+            <li>2) 除了“产品编码”、“数量”、“成本价”两列,其他列可自定义,不影响数据导入</li>
+            <li>3) “成本价”为空或输入的价格与系统设置相同时,允许导入</li>
+            <li>4) 如果导入的产品已经存在,则不会导入该行</li>
           </ul>
           <a-button type="link" icon="download" style="padding: 0 0 0 23px;" :loading="exportLoading" @click="handleExport">下载导入模板</a-button>
         </div>

+ 46 - 21
src/views/purchasingManagement/bulkWarehousingOrder/list.vue

@@ -138,6 +138,9 @@
     <sparePartsDetailModal v-drag :openModal="openDetailModal" :itemSn="itemSn" @close="closeDetailModal" />
     <!-- 导出提示框 -->
     <reportModal :visible="showExport" @close="showExport=false"></reportModal>
+    <!-- 审核不通过弹框 -->
+    <auditNoPassModal v-drag ref="auditNoPassModal" :openModal="openAuditNoModal" @close="openAuditNoModal=false" />
+    <batchAuditNoModal v-drag ref="batchAuditNoModal" :openModal="openBatchAuditNoModal" @close="openBatchAuditNoModal=false" @ok="hanldeAuditOk" />
   </a-card>
 </template>
 
@@ -147,12 +150,14 @@ import { STable, VSelect } from '@/components'
 import basicInfoModal from './basicInfoModal.vue'
 import sparePartsDetailModal from './detailModal.vue'
 import reportModal from '@/views/common/reportModal.vue'
+import auditNoPassModal from './auditNoPassModal.vue'
+import batchAuditNoModal from './batchAuditNoModal.vue'
 import { hdExportExcel } from '@/libs/exportExcel'
-import { sparePartsList, sparePartsDelete, sparePartsAudit, sparePartsDetailExport } from '@/api/spareParts'
+import { sparePartsList, sparePartsDelete, sparePartsAudit, sparePartsAuditVerify, sparePartsDetailExport } from '@/api/spareParts'
 export default {
   name: 'BulkWarehousingOrderList',
   mixins: [commonMixin],
-  components: { STable, VSelect, basicInfoModal, sparePartsDetailModal, reportModal },
+  components: { STable, VSelect, basicInfoModal, sparePartsDetailModal, reportModal, auditNoPassModal,batchAuditNoModal },
   data () {
     return {
       spinning: false,
@@ -160,6 +165,8 @@ export default {
       openModal: false, // 基本信息弹框是否显示
       showExport: false,
       exportLoading: false,
+      openAuditNoModal: false,
+      openBatchAuditNoModal: false,
       tableHeight: 0,
       // 查询参数
       queryParam: {
@@ -290,43 +297,61 @@ export default {
       this.$refs.table.refresh(true)
     },
     //  单条审核
-    handleAudit (row, isBatch) {
+    handleAudit (row) {
       const _this = this
-      let content = ''
-      let params = []
-      if (isBatch) { //  批量
-        content = '确认要批量审核吗?'
-        params = row
-      } else { //  单条
-        content = '确认要审核通过吗?'
-        params = [row.sparePartsSn]
-      }
       this.$confirm({
         title: '提示',
-        content: content,
+        content: '确认要审核通过吗?',
         centered: true,
         onOk () {
           _this.spinning = true
-          sparePartsAudit(params).then(res => {
+          sparePartsAudit({sn:row.sparePartsSn}).then(res => {
             if (res.status == 200) {
-              _this.$refs.table.clearSelected() // 清空表格选中项
-              _this.$message.success(res.message)
-              _this.$refs.table.refresh()
-              _this.spinning = false
-            } else {
-              _this.spinning = false
+              if(res.data&&res.data.sparePartsDetailList){
+                _this.$nextTick(()=>{
+                  _this.openAuditNoModal = true
+                  _this.$refs.auditNoPassModal.setData(res.data.sparePartsDetailList)
+                })
+              }else{
+                _this.hanldeAuditOk(res.message)
+              }
             }
+            _this.spinning = false
           })
         }
       })
     },
     // 批量审核
     handleBatchAudit () {
+      const _this = this
       if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length < 1)) {
         this.$message.warning('请在列表勾选后再进行批量操作!')
         return
       }
-      this.handleAudit(this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys, 'batch')
+      const snList = this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys || []
+      this.$confirm({
+        title: '提示',
+        content: '确认要批量审核通过吗?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          sparePartsAuditVerify(snList).then(res => {
+            if(res.status == 200&&res.data){
+              _this.$nextTick(()=>{
+                _this.openBatchAuditNoModal = true
+                _this.$refs.batchAuditNoModal.getData(res.data)
+              })
+            }
+            _this.spinning = false
+          })
+        }
+      })
+    },
+    // 审核成功
+    hanldeAuditOk(message){
+      this.$refs.table.clearSelected() // 清空表格选中项
+      this.$message.success(message)
+      this.$refs.table.refresh()
     },
     pageInit () {
       const _this = this

+ 5 - 0
src/views/purchasingManagement/bulkWarehousingOrder/productModal.vue

@@ -191,6 +191,7 @@ export default {
     },
     // 详情
     getDetail () {
+      this.spinning = true
       sparePartsDetailD({ sn: this.itemSn }).then(res => {
         if (res.status == 200) {
           const data = res.data
@@ -199,7 +200,9 @@ export default {
           this.form.warehouse = [this.form.warehouseSn, this.form.warehouseLocationSn]
           this.warehouseSnBackups = this.form.warehouseSn || undefined
           this.warehouseLocationSnBackups = this.form.warehouseLocationSn || undefined
+          this.isGift = this.form.giftFlag == 1
         }
+        this.spinning = false
       })
     },
     //  保存
@@ -211,6 +214,7 @@ export default {
           form.sparePartsSn = this.nowData.sparePartsSn
           form.sparePartsNo = this.nowData.sparePartsNo
           form.supplierSn = this.nowData.supplierSn
+          form.giftFlag = this.isGift ? 1 : 0
           if (!_this.itemSn) {
             delete form.id
             delete form.sparePartsDetailSn
@@ -304,6 +308,7 @@ export default {
         productCost: '',
         productQty: ''
       }
+      this.isGift = false
       // this.$refs.productSn.focus()
     }
   },

+ 4 - 0
src/views/supplierManagement/costSetting/settingCost.vue

@@ -96,6 +96,7 @@ export default {
     setData (row) {
       this.form.supplierSn = row.supplierSn
       this.form.supplierProductSn = row.supplierProductSn
+      this.form.modifyCost = ''
       this.cost = row.cost
       this.productName = row.product.name
       this.productCode = row.product.code
@@ -130,6 +131,9 @@ export default {
       this.$emit('close')
       this.productName = ''
       this.productCode = ''
+      this.form.modifyCost = ''
+      this.form.supplierSn= ''
+      this.form.supplierProductSn= ''
       this.$refs.ruleForm.resetFields()
     }
   },