소스 검색

Merge branch 'develop_yh29' of jianguan-web/jg-ocs-html into pre-release

李磊 1 년 전
부모
커밋
5c0ba9a5b7

BIN
public/templ/唯一码导入模板.xlsx


+ 1 - 1
public/version.json

@@ -1,4 +1,4 @@
 {
-    "version": "2.2.28",
+    "version": "2.2.29",
     "message": "发现有新版本发布,确定更新系统?"
 }

+ 7 - 0
src/api/expenseManagement.js

@@ -16,6 +16,13 @@ export const employeeQueryList = (params) => {
     method: 'post'
   })
 }
+// 其它往来人员
+export const otherOrgQuery = (params) => {
+  return axios({
+    url: `/otherorg/queryAll`,
+    method: 'get'
+  })
+}
 
 // 费用报销单列表
 export const expenseAccountList = (params) => {

+ 96 - 0
src/api/reportData.js

@@ -941,3 +941,99 @@ export const exportSalesPromoRealReport = (params) => {
     responseType: 'blob'
   })
 }
+
+/*
+*   产品追溯列表
+*/
+
+// 导出错误项
+export const codeExportImportError = (params) => {
+  return axios({
+    url: '/report/tracecode/exportImportError',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+
+// 确定导入轮胎唯一码
+export const traceCodeInsertBatch = (params) => {
+  const url = `/report/tracecode/insertBatch`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 获取  产品追溯列表
+export const traceCodeList = (params) => {
+  const url = `/report/tracecode/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 产品追溯列表   统计
+export const traceCodeQueryCount = (params) => {
+  const url = '/report/tracecode/queryCount'
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 产品追溯列表 导出
+export const excelOnlineList = (params) => {
+  return axios({
+    url: '/report/tracecode/excelOnlineList',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 质保信息
+export const getWarrantyInfo = (params) => {
+  return axios({
+    url: `/report/warranty/queryById/${params.id}`,
+    method: 'post'
+  })
+}
+/*
+*   轮胎统计报表
+*/
+
+// 轮胎统计报表   列表
+export const queryTireList = (params) => {
+  const url = `/report/tire/queryTirePage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 轮胎统计报表  统计
+export const queryTireCount = (params) => {
+  return axios({
+    url: '/report/tire/queryTireCount',
+    data: params,
+    method: 'post'
+  })
+}
+// 轮胎统计报表  导出
+export const excelTireOnlineExport = (params) => {
+  return axios({
+    url: '/report/tire/excelTireOnlineList',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}

BIN
src/assets/img/ongoing.png


BIN
src/assets/img/outOfDateImg.png


+ 51 - 0
src/config/router.config.js

@@ -1834,6 +1834,31 @@ export const asyncRouterMap = [
               }
             ]
           },
+          {
+            path: '/reportData/tireSalesReport',
+            redirect: '/reportData/tireSalesReport/list',
+            name: 'tireSalesReport',
+            component: BlankLayout,
+            meta: {
+              title: '轮胎统计报表',
+              icon: 'profile',
+              permission: 'M_tireSalesReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'tireSalesReportIndex',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/tireSalesReport/list.vue'),
+                meta: {
+                  title: '轮胎统计报表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_tireSalesReportList'
+                }
+              }
+            ]
+          },
           {
             path: '/reportData/allocationOrderTotal',
             redirect: '/reportData/allocationOrderTotal/list',
@@ -2451,6 +2476,7 @@ export const asyncRouterMap = [
               }
             ]
           }
+
           // {
           //   path: '/reportData/allCountryCostReport',
           //   redirect: '/reportData/allCountryCostReport/list',
@@ -2873,6 +2899,31 @@ export const asyncRouterMap = [
                 }
               }
             ]
+          },
+          {
+            path: '/productManagement/productSourcePath',
+            redirect: '/productManagement/productSourcePath/list',
+            name: 'productSourcePath',
+            component: BlankLayout,
+            meta: {
+              title: '唯一码追溯列表',
+              icon: 'radar-chart',
+              permission: 'M_productSourcePathList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productSourcePathList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productSourcePath/list.vue'),
+                meta: {
+                  title: '唯一码追溯列表',
+                  icon: 'radar-chart',
+                  hidden: true,
+                  permission: 'M_productSourcePathList'
+                }
+              }
+            ]
           }
         ]
       },

+ 83 - 0
src/views/common/otherTransactions.js

@@ -0,0 +1,83 @@
+import { otherOrgQuery } from '@/api/expenseManagement.js'
+const Employee = {
+  template: `
+      <a-select
+        :placeholder="placeholder"
+        :id="id"
+        allowClear
+        :value="defaultVal"
+        :showSearch="true"
+        :disabled="disabledFlag"
+        @change="handleChange"
+        option-filter-prop="children"
+        :filter-option="filterOption">
+        <a-select-option v-for="item in list" :key="item.otherOrgSn" :value="item.otherOrgSn">
+        {{ item.otherOrgName }}
+        </a-select-option>
+      </a-select>
+    `,
+  props: {
+    value: {
+      type: String,
+      defatut: ''
+    },
+    id: {
+      type: String,
+      default: ''
+    },
+    placeholder: {
+      type: String,
+      default: '请选择其它往来机构'
+    },
+    enableFlag: {
+      type: String,
+      default: ''
+    },
+    disabledFlag: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      defaultVal: this.value,
+      list: []
+    }
+  },
+  mounted () {
+    this.getList()
+  },
+  watch: {
+    value (newValue, oldValue) {
+      this.defaultVal = newValue
+    }
+  },
+  methods: {
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      )
+    },
+    handleChange (value) {
+      this.defaultVal = value
+      const item = this.list.find(item => item.supplierSn == value)
+      this.$emit('input', value)
+      this.$emit('change', value, item)
+    },
+    getList () {
+      otherOrgQuery().then(res => {
+        if (res.status == 200) {
+          if (this.enableFlag != '') {
+            this.list = res.data.filter(item => item.enableFlag == this.enableFlag)
+          } else {
+            this.list = res.data
+          }
+        } else {
+          this.list = []
+        }
+      })
+    }
+  }
+}
+
+export default Employee

+ 230 - 0
src/views/productManagement/productSourcePath/chooseImportModal.vue

@@ -0,0 +1,230 @@
+<template>
+  <a-modal
+    centered
+    class="chooseImport-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="导入"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="900">
+    <div class="chooseImport-con">
+      <!-- 可导入数据 -->
+      <div class="chooseImport-head">
+        <p class="text-overflow">可导入数据{{ loadData.length }}条</p>
+        <p>
+          <a-tooltip placement="right">
+            <template slot="title">
+              <div v-for="(con,i) in countData" :key="i"><strong>业务单号</strong>({{ con.bizCode }})<span v-for="(item,j) in con.info" :key="j">{{ item.productCode }}(<span class="red">{{ item.productNum }}</span>/{{ item.bizProductNum }});</span></div>
+            </template>
+            <div class="text-overflows2" v-if="countData && countData.length>0">
+              可导入产品数量与实际销售数量有差异:<span v-for="(con,i) in countData" :key="i"><strong>业务单号</strong>({{ con.bizCode }})<span v-for="(item,j) in con.info" :key="j">{{ item.productCode }}(<span class="red">{{ item.productNum }}</span>/{{ item.bizProductNum }});</span></span>
+            </div>
+          </a-tooltip>
+        </p>
+      </div>
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.no"
+        rowKeyName="no"
+        :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.no"
+        rowKeyName="no"
+        :columns="nowUnColumns"
+        :dataSource="unLoadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="chooseImport-submit"
+          size="large"
+          :class="loadData.length==0?'button-grey':'button-primary'"
+          @click="handleSubmit"
+          style="padding: 0 40px;">确认导入</a-button>
+        <a-button
+          id="chooseImport-cancel"
+          size="large"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 40px;margin-left: 15px;">取消</a-button>
+        <a-button
+          type="primary"
+          id="chooseImport-error"
+          size="large"
+          class="button-error"
+          @click="handleError"
+          style="padding: 0 40px;margin-left: 15px;">导出错误项</a-button>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { codeExportImportError } from '@/api/reportData'
+export default {
+  name: 'ChooseImportModal',
+  mixins: [commonMixin],
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    paramsData: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      nowColumns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '产品编码', dataIndex: 'productCode', width: '21%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '唯一码', dataIndex: 'traceCode', width: '21%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '业务单号', dataIndex: 'bizCode', width: '21%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '工厂出库单号', dataIndex: 'factoryOutNo', width: '26%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      loadData: [],
+      nowUnColumns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '产品编码', dataIndex: 'productCode', width: '17%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '唯一码', dataIndex: 'traceCode', width: '17%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '业务单号', dataIndex: 'bizCode', width: '17%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '工厂出库单号', dataIndex: 'factoryOutNo', width: '17%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '备注', dataIndex: 'errorDesc', width: '27%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      unLoadData: [],
+      loading: false,
+      countData: []
+    }
+  },
+  methods: {
+    // 获取导入列表
+    getData () {
+      const _this = this
+      const paramsData = JSON.parse(JSON.stringify(_this.paramsData))
+      this.loadData = paramsData.rightList || []
+      this.unLoadData = paramsData.errorList || []
+      this.loadData.map((item, index) => {
+        item.no = index + 1
+      })
+      this.unLoadData.map((item, index) => {
+        item.no = index + 1
+      })
+      if (paramsData.billList && paramsData.billList.length > 0) {
+        const newCountData = paramsData.billList || []
+        newCountData.map(item => {
+          item.info = [{ productCode: item.productCode,
+            productNum: item.productNum,
+            bizProductNum: item.bizProductNum }]
+        })
+        const mergedObjects = newCountData.reduce((acc, obj) => {
+          const index = acc.findIndex(o => { return o.bizCode == obj.bizCode })
+          if (index != -1) {
+            acc[index].info.push({ productCode: obj.productCode,
+              productNum: obj.productNum,
+              bizProductNum: obj.bizProductNum })
+          } else {
+            acc.push(obj)
+          }
+          return acc
+        }, [])
+        this.countData = mergedObjects
+      }
+    },
+    compareObjects (obj1, obj2) {
+      return Object.keys(obj1).every(key => obj1[key] === obj2[key])
+    },
+    // 确认导入
+    handleSubmit () {
+      if (this.loadData.length == 0) {
+        this.$message.warning('无可导入数据!')
+      } else {
+        this.$emit('ok', this.loadData)
+        this.isShow = false
+      }
+    },
+    // 导出 错误项
+    handleError () {
+      const _this = this
+      if (_this.unLoadData.length < 1) {
+        _this.$message.info('暂无可导出的错误项~')
+        return
+      }
+      _this.spinning = true
+      hdExportExcel(codeExportImportError, _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.countData = []
+      } else {
+        this.getData()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .chooseImport-modal{
+    .chooseImport-con{
+      .red{
+        color: #f30;
+      }
+      .btn-con{
+        text-align: center;
+        margin: 30px 0 20px;
+        .button-cancel,.button-error{
+          font-size: 12px;
+        }
+      }
+      .chooseImport-head{
+        display:flex;
+        align-items:center;
+        p:first-child{
+          max-width:12%;
+        }
+        p:last-child{
+          margin-left:10px;
+          max-width:88%;
+        }
+      }
+    }
+  }
+</style>

+ 197 - 0
src/views/productManagement/productSourcePath/importGuideModal.vue

@@ -0,0 +1,197 @@
+<template>
+  <a-modal
+    centered
+    class="importGuide-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="导入费用明细"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="800">
+    <div class="importGuide-con">
+      <div class="explain-con">
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>1</span>准备导入
+          </div>
+          <ul>
+            <li>1) 请先下载导入模板,模板中已标示出必填项</li>
+            <li>2) “产品编码”该业务单中存在的产品编码</li>
+            <li>3) “唯一码”具有唯一性,必填,需输入正确唯一码,不能为空,不可重复</li>
+            <li>4) 业务单号需是系统中已审核通过的销售单和调拨单</li>
+            <li>5) “工厂出库单号”非必填,可重复,可为空</li>
+            <li>
+              <a :href="filePath" style="margin: 5px 0 0;display: block;">
+                <a-icon type="download" style="padding-right: 5px;" />下载导入模板
+              </a>
+            </li>
+          </ul>
+        </div>
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>2</span>上传数据文件
+          </div>
+          <p>目前支持的文件类型*.xls,*.xlsx.</p>
+          <div style="overflow: hidden;padding-left: 23px;">
+            <Upload
+              id="importGuide-attachList"
+              ref="importUpload"
+              :maxNums="1"
+              fileType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
+              uploadType="attach"
+              :action="attachAction"
+              :uploadParams="uploadParams"
+              upText="选择导入文件"
+              @remove="resetSearchForm"
+              @change="changeImport"></Upload>
+          </div>
+        </div>
+      </div>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="importGuide-nextStep"
+          size="large"
+          class="button-primary"
+          @click="handlerNextStep"
+          style="padding: 0 60px;">下一步</a-button>
+        <a-button
+          id="importGuide-cancel"
+          size="large"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 60px;margin-left: 15px;">取消</a-button>
+      </div>
+    </div>
+    <!-- 导入 -->
+    <chooseImportModal :openModal="openImportModal" :paramsData="paramsData" @close="handleClose" @ok="hanldeOk" />
+  </a-modal>
+</template>
+
+<script>
+import ChooseImportModal from './chooseImportModal.vue'
+import { Upload } from '@/components'
+export default {
+  name: 'ImportGuideModal',
+  components: { Upload, ChooseImportModal },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    params: {
+      type: Object,
+      default: null
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      openImportModal: false, //  导入
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/report/tracecode/importParse',
+      paramsData: null,
+      uploadParams: {
+        savePathType: 'local'
+      },
+      exportLoading: false,
+      filePath: location.protocol + '//' + location.host + '/templ/唯一码导入模板.xlsx'
+    }
+  },
+  methods: {
+    // 清空数据
+    resetSearchForm () {
+      this.$refs.importUpload.setFileList() //  清空导入文件
+      this.paramsData = null //  清空上传数据
+    },
+    // 下一步
+    handlerNextStep () {
+      if (this.paramsData) {
+        this.openImportModal = true
+      } else {
+        this.$message.warning('添加文件后再进行下一步操作!')
+      }
+    },
+    // 上传文件  change
+    changeImport (file) {
+      // console.log(file, JSON.parse(file))
+      if (file && JSON.parse(file).length > 0) {
+        this.paramsData = Object.assign({}, JSON.parse(file)[0] || null, this.params)
+      } else {
+        this.paramsData = null
+      }
+    },
+    // 导入
+    hanldeOk (obj) {
+      this.$emit('ok', obj)
+      this.isShow = false
+    },
+    // 关闭
+    handleClose () {
+      this.openImportModal = false
+      this.isShow = false
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.resetSearchForm()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .importGuide-modal{
+    .importGuide-con{
+      .explain-con{
+        .explain-item{
+          margin-bottom: 10px;
+          .explain-tit{
+            font-weight: bold;
+            span{
+              display: inline-block;
+              width: 18px;
+              height: 18px;
+              line-height: 16px;
+              text-align: center;
+              margin-right: 5px;
+              border-radius: 50%;
+              border: 1px solid rgba(0, 0, 0, 0.3);
+            }
+          }
+          p{
+            margin: 8px 0;
+            padding-left: 23px;
+          }
+          ul{
+            list-style: none;
+            padding: 0;
+            padding-left: 23px;
+            margin: 0;
+            li{
+              line-height: 26px;
+            }
+          }
+        }
+        #importGuide-attachList{
+          width: 100%;
+        }
+      }
+      .btn-con{
+        margin: 10px 0 20px;
+        text-align: center;
+        .button-cancel{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 378 - 0
src/views/productManagement/productSourcePath/list.vue

@@ -0,0 +1,378 @@
+<template>
+  <div>
+    <a-card size="small" :bordered="false" class="tireSalesReportList-wrap searchBox">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper" ref="tableSearch">
+        <a-form-model
+          id="tireSalesReportList-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam"
+          @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="审核时间">
+                <rangeDate ref="rangeDate" :value="time" @change="dateChange" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="业务单号">
+                <a-input
+                  id="productSourceList-bizCode"
+                  v-model.trim="queryParam.bizCode"
+                  allowClear
+                  placeholder="请输入业务单号" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品编码">
+                <a-input
+                  id="productSourceList-productCode"
+                  v-model.trim="queryParam.productCode"
+                  allowClear
+                  placeholder="请输入产品编码" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="唯一码">
+                <a-input
+                  id="productSourceList-traceCode"
+                  v-model.trim="queryParam.traceCode"
+                  allowClear
+                  placeholder="请输入唯一码" />
+              </a-form-item>
+            </a-col>
+            <template v-if="advanced">
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="单据类型">
+                  <a-select @change="handleBizStatus" v-model="queryParam.bizStatus" placeholder="请选择单据类型" allowClear>
+                    <a-select-option value="XS">
+                      销售单
+                    </a-select-option>
+                    <a-select-option value="DB">
+                      调拨单
+                    </a-select-option>
+                  </a-select>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-item label="产品名称">
+                  <a-input
+                    id="productSourceList-productName"
+                    v-model.trim="queryParam.productName"
+                    allowClear
+                    placeholder="请输入产品名称" />
+                </a-form-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="客户名称">
+                  <dealerSearchList ref="dealerSubareaScopeList" id="productSourceList-buyerName" @change="custChange" />
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="质保状态">
+                  <!-- <v-select
+                    v-model="queryParam.dealerLevel"
+                    ref="dealerLevel"
+                    id="productSourceList-dealerLevel"
+                    code="DEALER_LEVEL"
+                    placeholder="请选择质保状态"
+                    allowClear></v-select> -->
+                  <a-select v-model="queryParam.warrantyState" placeholder="请选择质保状态" allowClear>
+                    <a-select-option value="NOTSTART">
+                      未开始
+                    </a-select-option>
+                    <a-select-option value="RUN">
+                      进行中
+                    </a-select-option>
+                    <a-select-option value="END">
+                      已过期
+                    </a-select-option>
+                  </a-select>
+                </a-form-model-item>
+              </a-col>
+            </template>
+            <a-col :md="24" :sm="24" style="text-align: center;">
+              <a-button
+                style="margin-left: 5px"
+                type="primary"
+                @click="$refs.table.refresh(true)"
+                :disabled="disabled"
+                id="productSourceList-refresh">查询</a-button>
+              <a-button
+                style="margin-left: 8px"
+                @click="resetSearchForm"
+                :disabled="disabled"
+                id="productSourceList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 10px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_productSourceExport')"
+                id="productSourceList-export">导出</a-button>
+              <a @click="advanced=!advanced" style="margin-left: 5px">
+                {{ advanced ? '收起' : '展开' }}
+                <a-icon :type="advanced ? 'up' : 'down'" />
+              </a>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+    </a-card>
+    <a-card size="small" :bordered="false">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <!-- 统计 -->
+        <div style="display:flex;align-items:center;margin-bottom:10px;">
+          <a-button
+            type="primary"
+            id="outboundOrder-export"
+            :loading="loading"
+            v-if="$hasPermissions('B_productSourceImport')"
+            @click="openGuideModal = true">导入</a-button>
+          <div class="tongji-bar" style="margin-left:10px;">
+            产品总款数:<strong>{{ totalData&&(totalData.productTypeNum || totalData.productTypeNum==0) ? totalData.productTypeNum : '0' }}</strong>;
+            产品总数量:<strong>{{ totalData&&(totalData.productNum || totalData.productNum==0) ? totalData.productNum : '--' }}</strong>;
+          </div>
+        </div>
+        <!-- 列表 -->
+        <s-table
+          class="sTable fixPagination"
+          ref="table"
+          size="small"
+          :rowKey="(record) => record.id"
+          :style="{ height: tableHeight+70+'px' }"
+          :columns="columns"
+          :data="loadData"
+          :scroll="{ y: tableHeight-10 }"
+          :defaultLoadData="false"
+          bordered>
+          <!-- 质保时间 -->
+          <template slot="warrantyTime" slot-scope="text, record">
+            <span v-if="record.warrantyStartDate">
+              {{ record.warrantyStartDate }}{{ record.warrantyEndDate?'至'+record.warrantyEndDate:'' }}
+            </span>
+            <span v-else>--</span>
+          </template>
+          <!-- 操作 -->
+          <template slot="action" slot-scope="text, record">
+            <a-button v-if="$hasPermissions('B_productSourceSeeInfo')&&record.warrantyState!='NOTSTART'" size="small" type="link" class="button-warning" @click="handleInfoModal(record)">质保信息</a-button>
+            <span v-else>--</span>
+          </template>
+        </s-table>
+      </a-spin>
+      <!-- 质保信息-->
+      <warranty-info-modal v-drag :openModal="openInfoModal" :productCode="productCodeInfo" :itemSn="warrantyInfoId" @close="closeWarranty" />
+      <!-- 导入轮胎唯一码 -->
+      <importGuideModal :openModal="openGuideModal" @close="openGuideModal=false" @ok="handleGuideOk" />
+    </a-card>
+  </div>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import getDate from '@/libs/getDate.js'
+import { STable, VSelect } from '@/components'
+import rangeDate from '@/views/common/rangeDate.vue'
+import warrantyInfoModal from './warrantyInfoModal.vue'
+import importGuideModal from './importGuideModal.vue'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { traceCodeInsertBatch, traceCodeQueryCount, traceCodeList, excelOnlineList } from '@/api/reportData'
+import dealerSearchList from '@/views/common/dealerSearchList.vue'
+export default {
+  name: 'ProductSourceList',
+  mixins: [commonMixin],
+  components: { STable, VSelect, rangeDate, warrantyInfoModal, importGuideModal, dealerSearchList },
+  data () {
+    return {
+      loading: false,
+      spinning: false,
+      advanced: true, // 高级搜索 展开/关闭
+      tableHeight: 0,
+      time: [
+        getDate.getThreeMonthDays().starttime,
+        getDate.getCurrMonthDays().endtime
+      ],
+      queryParam: { //  查询条件
+        beginDate: getDate.getThreeMonthDays().starttime,
+        endDate: getDate.getCurrMonthDays().endtime,
+        productCode: '',
+        productName: '',
+        bizCode: undefined,
+        traceCode: undefined,
+        buyerName: undefined,
+        bizStatus: undefined,
+        warrantyState: undefined,
+        targetSn: undefined
+      },
+      openInfoModal: false, // 质保信息弹窗
+      columns: [{ title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '业务单号', dataIndex: 'bizCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '审核时间', dataIndex: 'auditDate', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '导入时间', dataIndex: 'importDate', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '唯一码', dataIndex: 'traceCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '客户名称', dataIndex: 'buyerName', width: '15%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '质保状态', dataIndex: 'warrantyStateDictValue', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '质保时间', scopedSlots: { customRender: 'warrantyTime' }, width: '10%', align: 'center' },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '12%', align: 'center' }
+      ],
+      disabled: false, //  查询、重置按钮是否可操作
+      exportLoading: false,
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        const params = Object.assign(parameter, this.queryParam)
+        return traceCodeList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            this.getCount(params)
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      totalData: null,
+      openGuideModal: false, // 导入弹窗
+      warrantyInfoId: null,
+      productCodeInfo: null
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  methods: {
+    custChange (val) {
+      if (val.row) {
+        this.queryParam.targetSn = val.row.dealerSn
+        this.queryParam.buyerName = val.name
+      } else {
+        this.queryParam.targetSn = undefined
+        this.queryParam.buyerName = val.key
+      }
+    },
+    // 单据类型操作
+    handleBizStatus (val) {
+      this.queryParam.bizStatus = val
+    },
+    // 导入成功
+    handleGuideOk (resData) {
+      traceCodeInsertBatch(resData).then(res => {
+        if (res.status == 200) {
+          this.resetSearchForm()
+        }
+      })
+    },
+    // 统计
+    getCount (params) {
+      traceCodeQueryCount(params).then(res => {
+        if (res.status == 200 && res.data) {
+          this.totalData = res.data
+        } else {
+          this.totalData = null
+        }
+      })
+    },
+    //  审核时间  change
+    dateChange (date) {
+      if (date[0] && date[1]) {
+        this.queryParam.time = date
+      } else {
+        this.queryParam.time = []
+      }
+      this.queryParam.beginDate = date[0] || ''
+      this.queryParam.endDate = date[1] || ''
+    },
+    // 质保信息
+    handleInfoModal (row) {
+      this.warrantyInfoId = row.warrantyid
+      this.productCodeInfo = row.productCode
+      this.openInfoModal = true
+    },
+    // 关闭质保信息弹窗
+    closeWarranty () {
+      this.warrantyInfoId = null
+      this.productCodeInfo = null
+      this.openInfoModal = false
+    },
+
+    //  重置
+    resetSearchForm () {
+      this.time = [
+        getDate.getThreeMonthDays().starttime,
+        getDate.getCurrMonthDays().endtime
+      ]
+      this.$refs.rangeDate.resetDate(this.time)
+      this.queryParam.beginDate = getDate.getThreeMonthDays().starttime
+      this.queryParam.endDate = getDate.getCurrMonthDays().endtime
+      this.totalData = null
+      this.queryParam.productCode = ''
+      this.queryParam.productName = ''
+      this.queryParam.bizCode = undefined
+      this.queryParam.traceCode = undefined
+      this.queryParam.buyerName = undefined
+      this.queryParam.targetSn = undefined
+      this.queryParam.bizStatus = undefined
+      this.queryParam.warrantyState = undefined
+      this.$refs.dealerSubareaScopeList.resetForm()
+      this.$refs.table.refresh(true)
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      const params = _this.queryParam
+      _this.exportLoading = true
+      _this.spinning = true
+      hdExportExcel(excelOnlineList, params, '唯一码追溯列表', function () {
+        _this.exportLoading = false
+        _this.spinning = false
+      })
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 247
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 219 - 0
src/views/productManagement/productSourcePath/warrantyInfoModal.vue

@@ -0,0 +1,219 @@
+<template>
+  <a-modal
+    centered
+    class="warrantyInfo-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="质保信息"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="600">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div v-if="detailsData">
+        <div class="infoList">
+          <div class="infoTopList">
+            <div class="uniqueStyle">
+              <div>轮胎名称:</div>
+              <a-tooltip placement="topLeft">
+                <template slot="title">
+                  <span>{{ detailsData.productName || '--' }}</span>
+                </template>
+                <div class="text-overflow">{{ detailsData.productName || '--' }}</div>
+              </a-tooltip>
+            </div>
+            <a-descriptions :column="1">
+              <a-descriptions-item label="产品编码">
+                {{ productCode || '--' }}
+              </a-descriptions-item>
+              <a-descriptions-item label="轮胎唯一码">
+                {{ detailsData.traceCode || '--' }}
+              </a-descriptions-item>
+              <a-descriptions-item label="质保时间" v-if="detailsData.warrantyStartDate">
+                {{ detailsData.warrantyStartDate }}{{ detailsData.warrantyEndDate?'至'+detailsData.warrantyEndDate:'' }}
+              </a-descriptions-item>
+              <a-descriptions-item label="质保时间" v-else>
+                --
+              </a-descriptions-item>
+            </a-descriptions>
+          </div>
+          <div class="imgBox">
+            <img
+              v-if="detailsData.productMsg"
+              style="margin-bottom:6px;object-fit: cover;border:1px dashed #ccc;"
+              :src="detailsData.productMsg"
+              alt="图片走丢啦"
+              width="86"
+              height="55"
+              align="middle"
+              @click="viewLargeImg"/>
+            <div style="text-align:right;">
+              <img
+                v-if="detailsData.state ==='END'"
+                src="@/assets/img/outOfDateImg.png"
+                alt=""
+                width="50"
+                height="50" />
+              <img v-if="detailsData.state ==='RUN'" src="@/assets/img/ongoing.png" alt="" width="50" height="50" />
+            </div>
+          </div>
+        </div>
+        <div class="infoList">
+          <a-descriptions title="门店信息" :column="1">
+            <a-descriptions-item label="门店名称">
+              {{ detailsData.storeName|| '--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="姓名">
+              {{ detailsData.storeManager ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="电话">
+              {{ detailsData.storeMobile ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="汽配经销商">
+              {{ detailsData.dealerName ||'--' }}
+            </a-descriptions-item>
+          </a-descriptions>
+        </div>
+        <div class="infoList">
+          <a-descriptions title="车辆信息" :column="1">
+            <a-descriptions-item label="车辆品牌">
+              {{ detailsData.carBrand ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="车型">
+              {{ detailsData.carModel ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="里程数">
+              {{ detailsData.mileage ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="车牌号">
+              {{ detailsData.vehicleNumber ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="客户姓名">
+              {{ detailsData.customName ||'--' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="手机号码">
+              {{ detailsData.customMobile ||'--' }}
+            </a-descriptions-item>
+          </a-descriptions>
+        </div>
+      </div>
+      <div class="btn-cont">
+        <a-button id="warrantyInfo-back" @click="isShow = false">关闭</a-button>
+      </div>
+    </a-spin>
+    <!-- 查看图片 -->
+    <a-modal v-model="openImgModal" :title="null" :footer="null" :width="600" centered>
+      <div class="viewImg">
+        <img
+          :src="detailsData.productMsg"
+          alt="图片走丢啦"
+          width="100%"
+          height="100%"
+          align="middle"/>
+      </div>
+    </a-modal>
+  </a-modal>
+</template>
+
+<script>
+import { getWarrantyInfo } from '@/api/reportData'
+export default {
+  name: 'ProductPricingAuditModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    itemSn: {
+      type: String,
+      default: ''
+    },
+    productCode: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      spinning: false,
+      detailsData: null, //  详情数据
+      openImgModal: false
+    }
+  },
+  methods: {
+    //  获取详情
+    getDetail () {
+      getWarrantyInfo({ id: this.itemSn }).then(res => {
+        if (res.status == 200) {
+          this.detailsData = res.data
+        } else {
+          this.detailsData = null
+        }
+      })
+    },
+    // 查看图片
+    viewLargeImg () {
+      this.openImgModal = true
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      } else {
+        this.getDetail()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .warrantyInfo-modal{
+    .ant-modal-body {
+      padding: 30px 40px 24px;
+    }
+    .infoList {
+      margin-bottom:26px;
+      .uniqueStyle{
+        display:flex;
+        algin-items:center;
+        margin-bottom:5px;
+        div:last-child{
+          width:78%;
+        }
+      }
+      .ant-descriptions-title{
+        margin-bottom:10px !important;
+      }
+      .ant-descriptions-row > th, .ant-descriptions-row > td{
+        padding-bottom: 5px !important;
+      }
+      .infoTopList{
+        max-width:70%;
+        position: relative;
+       .ant-descriptions-row{
+          font-weight: bold;
+        }
+        .ant-descriptions-row .ant-descriptions-item > span{
+          font-weight: bold;
+        }
+      }
+      .imgBox{
+        position:absolute;
+        top:0;
+        left:71%;
+      }
+    }
+
+    .btn-cont {
+      text-align: center;
+      margin: 35px 0 20px;
+    }
+  }
+</style>

+ 1 - 1
src/views/promotionRulesManagement/dealerPromotions/sendProductsModal.vue

@@ -626,4 +626,4 @@ export default {
     }
   }
 
-</style>
+</style>

+ 330 - 0
src/views/reportData/tireSalesReport/list.vue

@@ -0,0 +1,330 @@
+<template>
+  <div>
+    <a-card size="small" :bordered="false" class="tireSalesDealerList-wrap searchBoxNormal">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper" ref="tableSearch">
+        <a-form-model
+          id="tireSalesDealerList-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="出库时间">
+                <rangeDate ref="rangeDate" :value="time" @change="dateChange" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="地区">
+                <AreaList id="tireSalesDealerList-areaList" changeOnSelect ref="areaList" @change="areaChange" defValKey="id"></AreaList>
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="区域/分区">
+                <subarea id="tireSalesDealerList-subarea" ref="subarea" @change="subareaChange"></subarea>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="客户名称">
+                <dealerSubareaScopeList ref="dealerSubareaScopeList" id="tireSalesDealerList-dealerName" @change="custChange" />
+              </a-form-model-item>
+            </a-col>
+            <template v-if="advanced">
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="客户级别">
+                  <v-select
+                    v-model="queryParam.dealerLevel"
+                    ref="dealerLevel"
+                    id="tireSalesDealerList-dealerLevel"
+                    code="DEALER_LEVEL"
+                    placeholder="请选择客户级别"
+                    allowClear></v-select>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="区域负责人">
+                  <BizUser v-model="queryParam.bizUserSn"></BizUser>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="产品编码/原厂编码">
+                  <a-input id="tireSalesDealerList-productWord" v-model.trim="queryParam.productWord" allowClear placeholder="请输入产品编码/原厂编码"/>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="产品名称">
+                  <a-input id="tireSalesDealerList-productName" v-model.trim="queryParam.productName" allowClear placeholder="请输入产品名称"/>
+                </a-form-model-item>
+              </a-col>
+            </template>
+            <a-col :md="24" :sm="24" style="text-align:center;margin-bottom:10px;">
+              <a-button
+                style="margin-left: 5px"
+                type="primary"
+                @click="$refs.table.refresh(true)"
+                :disabled="disabled"
+                id="tireSalesDealerList-refresh">查询</a-button>
+              <a-button
+                style="margin-left: 8px"
+                @click="resetSearchForm"
+                :disabled="disabled"
+                id="tireSalesDealerList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 10px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_tireSalesReportExport')"
+                id="tireSalesDealerList-export">导出</a-button>
+              <a @click="advanced=!advanced" style="margin-left: 5px">
+                {{ advanced ? '收起' : '展开' }}
+                <a-icon :type="advanced ? 'up' : 'down'" />
+              </a>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+    </a-card>
+    <a-card size="small" :bordered="false">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <!-- 列表 -->
+        <s-table
+          class="sTable fixPagination"
+          ref="table"
+          size="small"
+          :rowKey="(record) => record.no"
+          :style="{ height: tableHeight+70+'px' }"
+          rowKeyName="no"
+          :columns="columns"
+          :data="loadData"
+          :scroll="{ y: tableHeight-30 }"
+          :defaultLoadData="false"
+          bordered>
+          <template slot="addressInfo" slot-scope="text, record">
+            {{ record.provinceName }}{{ '/'+record.cityName }}{{ '/'+record.districtName }}
+          </template>
+          <template slot="footer">
+            <a-row :gutter="15">
+              <a-col :md="4" :sm="24">订货数量:{{ (totalData && (totalData.totalbuyAmount || totalData.totalbuyAmount==0)) ? totalData.totalbuyAmount : '--' }}</a-col>
+              <a-col :md="4" :sm="24" v-if="$hasPermissions('M_tireSalesReportList_salesPrice')">订货金额:{{ (totalData && (totalData.totalbuyPriceAmount || totalData.totalbuyPriceAmount==0)) ? toThousands(totalData.totalbuyPriceAmount): '--' }}</a-col>
+              <a-col :md="4" :sm="24">客户现有库存数量:{{ (totalData && (totalData.totalstoreAmount || totalData.totalstoreAmount==0)) ?totalData.totalstoreAmount: '--' }}</a-col>
+              <a-col :md="4" :sm="24">已绑质保单数量:{{ (totalData && (totalData.totalwarrantyAmount || totalData.totalwarrantyAmount==0)) ?totalData.totalwarrantyAmount: '--' }}</a-col>
+            </a-row>
+          </template>
+        </s-table>
+      </a-spin>
+    </a-card>
+    <!-- 导出提示框 -->
+    <reportModal :visible="showExport" @close="showExport=false"></reportModal>
+  </div>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import getDate from '@/libs/getDate.js'
+import { STable, VSelect } from '@/components'
+import rangeDate from '@/views/common/rangeDate.vue'
+import subarea from '@/views/common/subarea.js'
+import AreaList from '@/views/common/areaList.js'
+import BizUser from '@/views/common/bizUser.js'
+import reportModal from '@/views/common/reportModal.vue'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { queryTireList, queryTireCount, excelTireOnlineExport } from '@/api/reportData'
+import dealerSubareaScopeList from '@/views/common/dealerSubareaScopeList.vue'
+export default {
+  name: 'TireSalesDealerList',
+  mixins: [commonMixin],
+  components: { STable, VSelect, rangeDate, subarea, AreaList, BizUser, dealerSubareaScopeList, reportModal },
+  data () {
+    return {
+      spinning: false,
+      advanced: true, // 高级搜索 展开/关闭
+      tableHeight: 0,
+      time: [
+        getDate.getThreeMonthDays().starttime,
+        getDate.getCurrMonthDays().endtime
+      ],
+      queryParam: { //  查询条件
+        beginDate: getDate.getThreeMonthDays().starttime,
+        endDate: getDate.getCurrMonthDays().endtime,
+        provinceSn: undefined,
+        citySn: undefined,
+        districtSn: undefined,
+        dealerName: '',
+        dealerSn: '',
+        subareaSn: undefined,
+        subareaAreaSn: undefined,
+        bizUserSn: undefined,
+        productWord: '', // 产品编码/原厂编码
+        productName: '', // 产品名称
+        dealerLevel: undefined
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      exportLoading: false,
+      showExport: false,
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        const params = Object.assign(parameter, this.queryParam)
+        return queryTireList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+            this.getCount(params)
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      totalData: null
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  computed: {
+    columns () {
+      const _this = this
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '地区', scopedSlots: { customRender: 'addressInfo' }, width: '12%', align: 'center' },
+        { title: '区域', dataIndex: 'subareaName', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '分区', dataIndex: 'subareaAreaName', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '区域负责人', dataIndex: 'userNameQyfzrs', width: '7%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '客户名称', dataIndex: 'dealerName', width: '15%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '客户级别', dataIndex: 'dealerLevelDictValue', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '原厂编码', dataIndex: 'productOrgiCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', width: '15%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '订货数量', dataIndex: 'buyAmount', width: '80px', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: <div>客户现有<div>库存数量</div></div>, dataIndex: 'storeAmount', width: '80px', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: <div>已绑质保单<div>数量</div></div>, dataIndex: 'warrantyAmount', width: '80px', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+      ]
+      if (this.$hasPermissions('M_tireSalesReportList_salesPrice')) {
+        arr.splice(11, 0, { title: '订货金额', dataIndex: 'buyPriceAmount', width: '80px', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    custChange (val) {
+      this.queryParam.dealerName = val.name
+      this.queryParam.dealerSn = val.key
+    },
+    // 统计
+    getCount (params) {
+      queryTireCount(params).then(res => {
+        if (res.status == 200 && res.data) {
+          this.totalData = res.data
+        } else {
+          this.totalData = null
+        }
+      })
+    },
+    // 地区
+    areaChange (val) {
+      this.queryParam.provinceSn = val[0] ? val[0] : ''
+      this.queryParam.citySn = val[1] ? val[1] : ''
+      this.queryParam.districtSn = val[2] ? val[2] : ''
+    },
+    //  下推时间  change
+    dateChange (date) {
+      if (date[0] && date[1]) {
+        this.time = date
+      } else {
+        this.time = []
+      }
+      this.queryParam.beginDate = date[0] || ''
+      this.queryParam.endDate = date[1] || ''
+    },
+    subareaChange (val) {
+      this.queryParam.subareaSn = val[0] ? val[0] : undefined
+      this.queryParam.subareaAreaSn = val[1] ? val[1] : undefined
+    },
+    //  重置
+    resetSearchForm () {
+      this.time = [
+        getDate.getThreeMonthDays().starttime,
+        getDate.getCurrMonthDays().endtime
+      ]
+      this.$refs.rangeDate.resetDate(this.time)
+      this.queryParam.beginDate = getDate.getThreeMonthDays().starttime
+      this.queryParam.endDate = getDate.getCurrMonthDays().endtime
+      this.queryParam.provinceSn = undefined
+      this.queryParam.citySn = undefined
+      this.queryParam.districtSn = undefined
+      this.queryParam.dealerName = ''
+      this.queryParam.dealerSn = ''
+      this.queryParam.subareaSn = undefined
+      this.queryParam.subareaAreaSn = undefined
+      this.queryParam.bizUserSn = undefined
+      this.queryParam.productWord = undefined
+      this.queryParam.productName = undefined
+      this.queryParam.dealerLevel = undefined
+      this.totalData = null
+      this.$refs.areaList.clearData()
+      if (this.advanced) {
+        this.$refs.dealerSubareaScopeList.resetForm()
+        this.$refs.subarea.clearData()
+      }
+      this.$refs.table.clearTable()
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      const params = _this.queryParam
+      _this.exportLoading = true
+      _this.spinning = true
+      _this.showExport = true
+      _this.$store.state.app.curActionPermission = 'B_tireSalesReportExport'
+      hdExportExcel(excelTireOnlineExport, params, '轮胎统计报表', function () {
+        _this.exportLoading = false
+        _this.spinning = false
+        _this.$store.state.app.curActionPermission = ''
+      })
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.resetSearchForm()
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 198
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 89 - 89
src/views/salesManagement/outboundOrder/list.vue

@@ -87,94 +87,94 @@
         </a-form>
       </div>
     </a-card>
-  
-  <a-card size="small" :bordered="false" class="outboundOrderList-wrap">
-    <a-spin :spinning="spinning" tip="Loading...">
-      <!-- 列表 -->
-      <div style="margin-bottom: 10px">
-        <a-button
-          type="primary"
-          v-if="$hasPermissions('B_stockOut')"
-          id="outboundOrder-export"
-          :loading="loading"
-          @click="handleOutbound()">批量出库</a-button>
-        <a-button
-          type="primary"
-          v-if="$hasPermissions('B_stockSend')"
-          class="button-info"
-          id="outboundOrder-send"
-          :loading="loading"
-          @click="handleSendGood()">批量发货</a-button>
-        <span style="margin-left: 5px">
-          <template v-if="rowSelectionInfo && rowSelectionInfo.selectedRowKeys.length>0">{{ `已选 ${rowSelectionInfo.selectedRowKeys.length} 项` }}</template>
-        </span>
-      </div>
-      <s-table
-        class="sTable fixPagination"
-        ref="table"
-        :style="{ height: tableHeight+70+'px' }"
-        size="small"
-        :rowKey="(record) => record.stockOutSn"
-        rowKeyName="stockOutSn"
-        :row-selection="($hasPermissions('B_stockOut')||$hasPermissions('B_stockSend'))?{ columnWidth: 40, getCheckboxProps: record => ({ props: { disabled: record.state == 'CANCEL' } }) }:null"
-        @rowSelection="rowSelectionFun"
-        :columns="columns"
-        :data="loadData"
-        :scroll="{ y: tableHeight }"
-        :defaultLoadData="false"
-        bordered>
-        <!-- 单号 -->
-        <template slot="stockOutNo" slot-scope="text, record">
-          <span v-if="record.stockOutNo && detailPermissions(record)" class="link-bule" @click="handleDetail(record)">{{ record.stockOutNo }}</span>
-          <span v-else-if="record.stockOutNo && !detailPermissions(record)">{{ record.stockOutNo }}</span>
-          <span v-else>--</span>
-        </template>
-        <!-- 操作 -->
-        <template slot="action" slot-scope="text, record">
+
+    <a-card size="small" :bordered="false" class="outboundOrderList-wrap">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <!-- 列表 -->
+        <div style="margin-bottom: 10px">
           <a-button
-            size="small"
-            type="link"
-            v-if="record.state=='WAIT'&&$hasPermissions('B_stockOut')"
-            class="button-primary"
-            @click="handleOutbound(record)"
-            id="outboundOrderList-out-btn">出库</a-button>
+            type="primary"
+            v-if="$hasPermissions('B_stockOut')"
+            id="outboundOrder-export"
+            :loading="loading"
+            @click="handleOutbound()">批量出库</a-button>
           <a-button
-            size="small"
-            type="link"
-            class="button-primary"
-            v-if="record.sendFlag==0&&$hasPermissions('B_stockSend')"
-            @click="handleSendGood(record)"
-            id="outboundOrderList-sendBill">发货</a-button>
-          <span v-if="record.sendFlag==1&&record.state=='FINISH'">--</span>
-        </template>
-      </s-table>
-    </a-spin>
-    <!-- 详情 -->
-    <a-modal
-      centered
-      v-drag
-      class="outboundOrderDetail-modal"
-      :footer="null"
-      :maskClosable="false"
-      title="详情"
-      v-model="openModal"
-      v-if="openModal"
-      @cancel="cancleModal"
-      width="70%">
-      <div>
-        <pushOrderDetailModal v-if="outBizType=='SALES'" :outBizSubSn="orderSn" />
-        <allocationDetailModal v-if="outBizType=='ALLOCATE'" :outBizSn="orderSn" />
-      </div>
-    </a-modal>
-    <!-- 发货信息 -->
-    <sendGoodModal
-      v-drag
-      ref="detailModal"
-      modalTit="新增发货单"
-      :openModal="showDetailModal"
-      @ok="sendSuccess"
-      @cancel="showDetailModal=false"></sendGoodModal>
-  </a-card>
+            type="primary"
+            v-if="$hasPermissions('B_stockSend')"
+            class="button-info"
+            id="outboundOrder-send"
+            :loading="loading"
+            @click="handleSendGood()">批量发货</a-button>
+          <span style="margin-left: 5px">
+            <template v-if="rowSelectionInfo && rowSelectionInfo.selectedRowKeys.length>0">{{ `已选 ${rowSelectionInfo.selectedRowKeys.length} 项` }}</template>
+          </span>
+        </div>
+        <s-table
+          class="sTable fixPagination"
+          ref="table"
+          :style="{ height: tableHeight+70+'px' }"
+          size="small"
+          :rowKey="(record) => record.stockOutSn"
+          rowKeyName="stockOutSn"
+          :row-selection="($hasPermissions('B_stockOut')||$hasPermissions('B_stockSend'))?{ columnWidth: 40, getCheckboxProps: record => ({ props: { disabled: record.state == 'CANCEL' } }) }:null"
+          @rowSelection="rowSelectionFun"
+          :columns="columns"
+          :data="loadData"
+          :scroll="{ y: tableHeight }"
+          :defaultLoadData="false"
+          bordered>
+          <!-- 单号 -->
+          <template slot="stockOutNo" slot-scope="text, record">
+            <span v-if="record.stockOutNo && detailPermissions(record)" class="link-bule" @click="handleDetail(record)">{{ record.stockOutNo }}</span>
+            <span v-else-if="record.stockOutNo && !detailPermissions(record)">{{ record.stockOutNo }}</span>
+            <span v-else>--</span>
+          </template>
+          <!-- 操作 -->
+          <template slot="action" slot-scope="text, record">
+            <a-button
+              size="small"
+              type="link"
+              v-if="record.state=='WAIT'&&$hasPermissions('B_stockOut')"
+              class="button-primary"
+              @click="handleOutbound(record)"
+              id="outboundOrderList-out-btn">出库</a-button>
+            <a-button
+              size="small"
+              type="link"
+              class="button-primary"
+              v-if="record.sendFlag==0&&$hasPermissions('B_stockSend')"
+              @click="handleSendGood(record)"
+              id="outboundOrderList-sendBill">发货</a-button>
+            <span v-if="record.sendFlag==1&&record.state=='FINISH'">--</span>
+          </template>
+        </s-table>
+      </a-spin>
+      <!-- 详情 -->
+      <a-modal
+        centered
+        v-drag
+        class="outboundOrderDetail-modal"
+        :footer="null"
+        :maskClosable="false"
+        title="详情"
+        v-model="openModal"
+        v-if="openModal"
+        @cancel="cancleModal"
+        width="70%">
+        <div>
+          <pushOrderDetailModal v-if="outBizType=='SALES'" :outBizSubSn="orderSn" />
+          <allocationDetailModal v-if="outBizType=='ALLOCATE'" :outBizSn="orderSn" />
+        </div>
+      </a-modal>
+      <!-- 发货信息 -->
+      <sendGoodModal
+        v-drag
+        ref="detailModal"
+        modalTit="新增发货单"
+        :openModal="showDetailModal"
+        @ok="sendSuccess"
+        @cancel="showDetailModal=false"></sendGoodModal>
+    </a-card>
   </div>
 </template>
 
@@ -265,9 +265,9 @@ export default {
         { title: '发货状态', dataIndex: 'sendFlagDictValue', width: '7%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '操作', scopedSlots: { customRender: 'action' }, width: '7%', align: 'center' }
       ]
-	  if (this.isShowWarehouse) {
-	    arr.splice(6, 0, { title: '仓库', dataIndex: 'warehouseName', width: '10%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true })
-	  }
+      if (this.isShowWarehouse) {
+        arr.splice(6, 0, { title: '仓库', dataIndex: 'warehouseName', width: '10%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true })
+      }
       if (this.$hasPermissions('M_outboundOrderList_salesPrice')) { //  售价权限
         arr.splice(this.isShowWarehouse ? 8 : 7, 0, { title: '售价', dataIndex: 'productTotalPrice', width: '6%', align: 'right', customRender: text => ((text || text == 0) ? this.toThousands(text) : '--') })
       }

+ 7 - 7
src/views/salesManagement/pushOrderManagement/detailForOut.vue

@@ -97,7 +97,7 @@
             <a-badge count="促" v-if="record.promotionFlag=='GIFT'" :number-style="{ backgroundColor: '#52c41a', zoom:'80%' }"></a-badge>
             <a-badge count="特" v-if="record.promotionFlag=='DISCOUNT'" :number-style="{ backgroundColor: '#faad14', zoom:'80%' }"></a-badge>
           </template>
-           <!-- 销售价 -->
+          <!-- 销售价 -->
           <template slot="price" slot-scope="text, record">
             {{ toThousands(text) }}
             <span v-if="record.promotionFlag=='GIFT'||record.promotionFlag=='DISCOUNT'" title="原价">({{ toThousands(record.origPrice) }})</span>
@@ -128,7 +128,7 @@ import exportExcelModal from './exportExcelModal.vue'
 import { printBase64Fun, exportExcel } from '@/libs/JGPrint.js'
 import { dispatchDetaillListForOut, dispatchFindBySn, dispatchDetailPrint, dispatchDetailExcel } from '@/api/dispatch'
 export default {
-  name: 'detailForOut',
+  name: 'DetailForOut',
   mixins: [commonMixin],
   components: { STable, VSelect, sendTypeModal, exportExcelModal },
   props: {
@@ -184,7 +184,7 @@ export default {
       nowPrintType: '', //  当前打印类型
       openExcelModal: false,
       fromRouter: null,
-      nowType: 'print'
+      nowType: 'print',
     }
   },
   computed: {
@@ -205,7 +205,7 @@ export default {
         // { title: '本次下推金额', dataIndex: 'totalAmount', width: '8%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
       ]
       if (this.$hasPermissions('B_dispatchDetail_salesPrice')) { //  售价权限
-        arr.splice(5, 0, { title: '销售价格', dataIndex: 'price', width: '8%', align: 'right', scopedSlots: { customRender: 'price' }, })
+        arr.splice(5, 0, { title: '销售价格', dataIndex: 'price', width: '8%', align: 'right', scopedSlots: { customRender: 'price' } })
         arr.splice(9, 0, { title: '本次下推金额', dataIndex: 'totalAmount', width: '8%', align: 'right', customRender: text => ((text || text == 0) ? this.toThousands(text) : '--') })
       }
       if (this.$hasPermissions('B_dispatchDetail_cityPrice')) { //  市级权限
@@ -281,11 +281,11 @@ export default {
           params.type = params.type + '_STACK_PLACE'
         }
         // 原厂编码
-        if(obj.origCode == 1){
+        if (obj.origCode == 1) {
           params.type = params.type + '_ORIG_CODE'
         }
         // 装箱号
-        if(obj.packNo == 1){
+        if (obj.packNo == 1) {
           params.type = params.type + '_PACK_NUM'
         }
         printBase64Fun(
@@ -293,7 +293,7 @@ export default {
           Object.assign(params, obj || {}),
           type,
           taskName,
-          () => { 
+          () => {
             _this.spinning = false
             _this.$store.state.app.curActionPermission = ''
           },

+ 195 - 0
src/views/salesManagement/pushOrderManagement/uniqueCodeModal.vue

@@ -0,0 +1,195 @@
+<template>
+  <a-modal
+    centered
+    class="unique-code-modal"
+    :footer="null"
+    :maskClosable="false"
+    v-model="isShow"
+    :title="modalTit"
+    @cancel="isShow=false"
+    width="70%">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div class="common-main">
+        <!-- 搜索条件 -->
+        <div ref="tableSearch" class="table-page-search-wrapper">
+          <a-form layout="inline">
+            <a-row :gutter="15">
+              <a-col :md="6" :sm="24">
+                <a-form-item label="产品编码">
+                  <a-input v-model.trim="queryParam.outBizSubNo" allowClear placeholder="请输入产品编码"/>
+                </a-form-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-item label="唯一码">
+                  <a-input v-model.trim="queryParam.demanderName" allowClear placeholder="请输入唯一码"/>
+                </a-form-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-item label="产品名称">
+                  <a-input v-model.trim="queryParam.demanderName" allowClear placeholder="请输入产品名称"/>
+                </a-form-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <span class="table-page-search-submitButtons">
+                  <a-button type="primary" :disabled="disabled" @click="$refs.table.refresh(true)">查询</a-button>
+                  <a-button style="margin-left: 8px" :disabled="disabled" @click="resetSearchForm()">重置</a-button>
+                </span>
+              </a-col>
+            </a-row>
+          </a-form>
+        </div>
+        <a-alert type="info" style="margin-bottom: 10px;" v-if="detailData!=null">
+          <div slot="message">
+            <span v-if="$route.params.type!='stockOut'">
+              轮胎款数:<strong>{{ detailData&&(detailData.totalSalesQty || detailData.totalSalesQty==0) ? detailData.totalSalesQty : '--' }}</strong>;
+            </span>
+            轮胎总数量:<strong>{{ detailData&&(detailData.totalQty || detailData.totalQty==0) ? detailData.totalQty : '--' }}</strong>;
+          </div>
+        </a-alert>
+        <!-- 表格数据 -->
+        <s-table
+          class="sTable"
+          ref="table"
+          size="small"
+          :rowKey="(record) => record.id"
+          :columns="columns"
+          :data="loadData"
+          :scroll="{ y: 400 }"
+          :pageSize="10"
+          bordered>
+        </s-table>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { STable } from '@/components'
+import { stockOutList } from '@/api/stockOut'
+export default {
+  name: 'UniqueCodeModal',
+  mixins: [commonMixin],
+  components: { STable },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    modalTit: { // 弹框标题
+      type: String,
+      default: null
+    },
+    chooseData: {
+      type: Array,
+      default: function () {
+        return []
+      }
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      disabled: false,
+      spinning: false,
+      handlePlData: [],
+      queryParam: {
+        outBizSubNo: '',
+        demanderName: '',
+        receiverSn: undefined,
+        warehouseSn: undefined,
+        outBizTypeList: ['SALES', 'ALLOCATE']
+      },
+      orginData: [],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        return stockOutList(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+              const index = this.chooseData.findIndex(item => data.list[i].stockOutSn == item.stockOutSn)
+              data.list[i].checked = index >= 0
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          this.orginData = data.list
+          return data
+        })
+      },
+      snList: [],
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '4%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'stockOutNo', width: '25%', align: 'center' },
+        { title: '唯一码', dataIndex: 'outBizSubNo', width: '25%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'demanderName', width: '50%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true }
+      ],
+      detailData: null
+    }
+  },
+  methods: {
+    custChange (val) {
+      this.queryParam.receiverSn = val.key || ''
+    },
+    // 删除
+    handleDel (row) {
+      const i = this.chooseData.findIndex(item => row.stockOutSn == item.stockOutSn)
+      this.chooseData.splice(i, 1)
+      const oi = this.orginData.findIndex(item => row.stockOutSn == item.stockOutSn)
+      if (oi >= 0) {
+        this.orginData[oi].checked = false
+      }
+    },
+    // 选择
+    handleChoose (row) {
+      row.checked = true
+      this.chooseData.push(row)
+      this.$emit('choose')
+    },
+    // 取消
+    handleCommonCancel () {
+      this.$emit('cancel')
+    },
+    // 重置
+    resetSearchForm () {
+      this.queryParam = {
+        outBizSubNo: '',
+        demanderName: '',
+        receiverSn: undefined,
+        warehouseSn: undefined,
+        outBizTypeList: ['SALES', 'ALLOCATE']
+      }
+      this.orginData = []
+      this.$nextTick(() => {
+        this.$refs.dealerSubareaScopeList.resetForm()
+      })
+      if (this.$refs.table) {
+        this.$refs.table.refresh(true)
+      }
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.handleCommonCancel()
+      } else {
+        this.resetSearchForm()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+
+</style>

+ 22 - 10
src/views/salesManagement/receiptPrint/list.vue

@@ -298,23 +298,33 @@ export default {
       const auditInfo = await getBatchLastProcessInstance({ 'businessType': 'FINANCE_BOOK', 'businessSnList': bookSns }).then(res => res.data)
       console.log(auditInfo)
       bookSns.map(item => {
-        // 授信明细
+        // 授信明细,还款明细
         const rs = rows.filter(a => a.bookSn == item)
         let detailItemUseStr = ''
+        let detailPayUseStr = ''
         rs.map(b => {
           if (b.detailItemUseList) {
-            b.detailItemUseList.map((k, i) => {
-              detailItemUseStr = detailItemUseStr + k.itemName + '(' + k.itemAmount + ')' + (i == b.detailItemUseList.length - 1 ? '。' : ';')
-            })
+            detailItemUseStr = this.getUseDetailInfo(b.detailItemUseList)
+          }
+          if(b.detailItemPayList){
+            detailPayUseStr = this.getUseDetailInfo(b.detailItemPayList)
           }
         })
         // 审核信息
         const auditStr = auditInfo ? this.getAuditInfo(auditInfo[item]) : ''
-        retArr.push({ audit: auditStr, detail: detailItemUseStr, subList: rs })
+        retArr.push({ audit: auditStr, detail: detailItemUseStr, payDetail:detailPayUseStr, subList: rs })
       })
       console.log(retArr, '------------')
       this.handlePrint(retArr, 1, rows, bookSns)
     },
+    // 获取授信西悉尼
+    getUseDetailInfo(list){
+      let ret = ''
+      list.map((k, i) => {
+        ret = ret + k.itemName + '(' + k.itemAmount + ')' + (i == list.length - 1 ? '。' : ';')
+      })
+      return ret
+    },
     // 获取审核信息
     getAuditInfo (auditList) {
       let auditStr = ''
@@ -353,16 +363,18 @@ export default {
       this.spinning = true
       this.showTipModal = true
       let detailItemUseStr = ''
-
+      let detailPayUseStr = ''
       this.$nextTick(() => {
+        // type == 0 单个打印时
         if (type == 0 && row.detailItemUseList) {
-          row.detailItemUseList.map(k => {
-            detailItemUseStr = detailItemUseStr + k.itemName + '(' + k.itemAmount + ');'
-          })
+          detailItemUseStr = this.getUseDetailInfo(row.detailItemUseList)
+        }
+        if (type == 0 && row.detailItemPayList) {
+          detailPayUseStr = this.getUseDetailInfo(row.detailItemPayList)
         }
         // 审核信息
         const auditStr = auditInfo ? this.getAuditInfo(auditInfo[list.bookSn]) : ''
-        this.$refs.printModel.getData(type ? row : [{ audit: auditStr, detail: detailItemUseStr, subList: [row] }], type ? list : [list])
+        this.$refs.printModel.getData(type ? row : [{ audit: auditStr, detail: detailItemUseStr, payDetail: detailPayUseStr, subList: [row] }], type ? list : [list])
       })
     },
     printOk (res) {

+ 4 - 1
src/views/salesManagement/receiptPrint/printModel.vue

@@ -62,7 +62,10 @@
                         <td style="padding:3pt 1pt;width: 54pt;word-break:break-all;">{{ item.explainInfo }}</td>
                       </tr>
                     </table>
-                    <div style="padding:5pt 0;border-bottom: 1px solid #333;">使用授信明细:{{ fcItem.detail||'暂无。' }}</div>
+                    <div style="padding:5pt 0;border-bottom: 1px solid #333;">
+                      <div style="width:48%;display:inline-block;">使用授信明细:{{ fcItem.detail||'暂无。' }}</div>
+                      <div style="width:48%;display:inline-block;marign-left:1%;">授信还款明细: {{ fcItem.payDetail||'暂无。' }}</div>
+                    </div>
                     <div style="padding:5pt 0;">
                       审批人员:{{ fcItem.audit||'暂无。' }}
                     </div>

+ 2 - 3
src/views/salesManagement/waitDispatchNew/queryPart.vue

@@ -37,7 +37,7 @@
           </a-col>
           <a-col :md="4" :sm="24">
             <a-form-item label="下推类型">
-              <a-select allowClear v-model.trim="queryParam.pushProductType" :dropdownMatchSelectWidth="false" >
+              <a-select allowClear v-model.trim="queryParam.pushProductType" :dropdownMatchSelectWidth="false" placeholder="请选择下推类型">
                 <a-select-option value="">
                   全部产品
                 </a-select-option>
@@ -204,8 +204,7 @@ export default {
       return this.detailData&&this.detailData.promoFlag==1
     },
     hasNoPushedActive(){
-      const a = this.dataSource.filter(item => item.pushedQty>0)
-      return this.dataSource.length==0 ? false : !(a.length > 0)
+      return this.detailData&&this.detailData.totalPushedQty==0||!this.detailData.totalPushedQty
     },
     checkboxOption () {
       return {

+ 2 - 2
vue.config.js

@@ -108,9 +108,9 @@ const vueConfig = {
     // If you want to turn on the proxy, please remosve the mockjs /src/main.jsL11
     proxy: {
       '/api': {
-        // target: 'http://192.168.2.103:8602/ocs-admin',
+        target: 'http://192.168.2.103:8602/ocs-admin',
         // target: 'https://t.ocs.360arrow.com/ocs-admin', //  练习
-        target: 'https://p.ocs.360arrow.com/ocs-admin', //  预发布
+        // target: 'https://p.ocs.360arrow.com/ocs-admin', //  预发布
         ws: false,
         changeOrigin: true,
         pathRewrite: {