From 267bd274ff53fab3f0ebd46c74bdf79631c61319 Mon Sep 17 00:00:00 2001 From: wj <1285151836@qq.com> Date: Wed, 8 Nov 2023 10:37:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/inventory/stockCompareApi.js | 56 +++++ src/views/inventory/stockCompare.js | 310 +++++++++++++++++++++++++++ src/views/inventory/stockCompare.vue | 293 +++++++++++++++++++++++++ 3 files changed, 659 insertions(+) create mode 100644 src/api/inventory/stockCompareApi.js create mode 100644 src/views/inventory/stockCompare.js create mode 100644 src/views/inventory/stockCompare.vue diff --git a/src/api/inventory/stockCompareApi.js b/src/api/inventory/stockCompareApi.js new file mode 100644 index 00000000..6c02096d --- /dev/null +++ b/src/api/inventory/stockCompareApi.js @@ -0,0 +1,56 @@ +import axios from "@/utils/request"; + +export function stockComparePage(params) { + return axios({ + url: "/udiwms/stockCompare/page", + method: "POST", + data: params + }); +} + +export function selectInvProductDetail(params) { + return axios({ + url: "/udiwms/stockCompare/selectInvProductDetail", + method: "POST", + data: params + }); +} + +export function stockCompareSave(params) { + return axios({ + url: "/udiwms/stockCompare/save", + method: "POST", + data: params + }); +} + +export function stockCompareDelete(compareId) { + return axios({ + url: `/udiwms/stockCompare/delete/${compareId}`, + method: "DELETE", + }); +} + +export function stockCompareAddProduct(params) { + return axios({ + url: "/udiwms/stockCompare/addProduct", + method: "POST", + data: params + }); +} + +export function stockCompareDetailPage(params) { + return axios({ + url: "/udiwms/stockCompare/detail/page", + method: "POST", + data: params + }); +} + +export function stockCompareDetailDel(params) { + return axios({ + url: "/udiwms/stockCompare/detail/del", + method: "DELETE", + data: params + }); +} diff --git a/src/views/inventory/stockCompare.js b/src/views/inventory/stockCompare.js new file mode 100644 index 00000000..f4b171bb --- /dev/null +++ b/src/views/inventory/stockCompare.js @@ -0,0 +1,310 @@ +import { + selectInvProductDetail, stockCompareAddProduct, + stockCompareDelete, stockCompareDetailDel, stockCompareDetailPage, + stockComparePage, + stockCompareSave +} from "@/api/inventory/stockCompareApi"; +import {mainActionMap, stockCompareStatusEnum} from "@/utils/data"; +import data from "@/views/system/dict/data.vue"; + +let filterQuery = { + page: 1, + limit: 10, + id: null, + thrSysId: null, + invCode: null, + mainAction: null, + action: null, + remark: null, + status: null, +} +let param = { + thrSysId: null, + invCode: null, + action: null, + mainAction: '', + compareDate: [], + compareStartDate: '', + compareEndDate: '', + remark: null, +} +let selectProductQuery = { + page: 1, limit: 10, compareId: null +} + + +export default { + computed: { + stockCompareStatusEnum() { + return stockCompareStatusEnum + }, + data() { + return data + }, + mainActionMap() { + return mainActionMap + } + }, + data() { + return { + showSearch: true, + compareId: null, + editRow: null, + saveLoading: false, + showDialog: false, + loading: false, + stockCompareDetailLoading: false, + stockCompareDetailList: [], + stockCompareDetailTotal: 0, + stockCompareDetailQuery: { + page: 1, + limit: 10 + }, + // --------选入产品-------------- + showAddProductDialog: false, + productLoading: false, + productList: [], + checkProductList: [], + productTotal: 0, + // --------------------------- + filterQuery: {...filterQuery}, + list: [], + total: 0, + param: {...param}, + selectProductQuery: {...selectProductQuery}, + paramRules: { + thrSysId: [{required: true, message: '第三方系统不能为空', trigger: 'change'}], + invCode: [{required: true, message: '所属仓库不能为空', trigger: 'change'}], + compareDate: [{required: true, message: '对比时间不能为空', trigger: 'change'}], + remark: [{required: true, message: '备注描述不能为空', trigger: 'blur'}], + + }, + pickerOptions: { + shortcuts: [{ + text: '最近一周', + onClick(picker) { + let now = new Date(); + const end = new Date(now - 24 * 60 * 60 * 1000); + const start = new Date(now - 24 * 60 * 60 * 1000); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit('pick', [start, end]); + } + }, { + text: '最近一个月', + onClick(picker) { + let now = new Date(); + const end = new Date(now - 24 * 60 * 60 * 1000); + const start = new Date(now - 24 * 60 * 60 * 1000); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); + picker.$emit('pick', [start, end]); + } + }, { + text: '最近三个月', + onClick(picker) { + let now = new Date(); + const end = new Date(now - 24 * 60 * 60 * 1000); + const start = new Date(now - 24 * 60 * 60 * 1000); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); + picker.$emit('pick', [start, end]); + } + }], + disabledDate(time) { + const now = new Date(); + const oneDayAgo = new Date(now - 24 * 60 * 60 * 1000); + return time.getTime() >= oneDayAgo; + }, + firstDayOfWeek: 1 + }, + } + }, + created() { + this.getList() + }, + methods: { + checkProduct(isAll) { + let param = { + compareId: this.compareId, + isAll: isAll, + productIds: this.checkProductList + } + stockCompareAddProduct(param).then(res => { + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.$message.success(res.message) + this.showAddProductDialog = false + this.stockCompareDetailQuery.page = 1 + this.getStockCompareDetailList() + }) + }, + addProductSelectionChange(row) { + this.checkProductList = row.map(i => { + return {productId: i.productId} + }) + }, + //触发对比 + compareFunc() { + const loading = this.$loading({ + lock: true, + text: 'Loading', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }); + setTimeout(() => { + loading.close(); + }, 2000); + }, + showAddProduct() { + this.selectProductQuery = {...selectProductQuery, compareId: this.compareId} + this.productList = [] + this.checkProductList = [] + this.productTotal = 0 + this.showAddProductDialog = true + this.selectInvProductDetailList() + }, + getStockCompareDetailList() { + this.stockCompareDetailQuery.compareId = this.compareId + this.stockCompareDetailLoading = true + stockCompareDetailPage(this.stockCompareDetailQuery).then(res => { + this.stockCompareDetailLoading = false + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.stockCompareDetailList = res.data.list || [] + this.stockCompareDetailTotal = res.data.total || 0 + }).catch(e => { + this.stockCompareDetailLoading = false + }) + }, + selectInvProductDetailList() { + this.productLoading = true + selectInvProductDetail(this.selectProductQuery).then(res => { + this.productLoading = false + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.productList = res.data.list || [] + this.productTotal = res.data.total || 0 + }).catch(e => { + this.productLoading = false + }) + }, + saveStockCompare() { + this.saveLoading = true + this.$refs.stockCompare.validate(valid => { + if (valid) { + this.param.compareStartDate = this.param.compareDate[0] + this.param.compareEndDate = this.param.compareDate[1] + stockCompareSave(this.param).then(res => { + this.saveLoading = false + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.stockCompareDetailList = [] + this.stockCompareDetailTotal = 0 + this.compareId = res.data + this.editRow = {status: stockCompareStatusEnum.DRAFT.key} + }).catch(e => { + this.saveLoading = false + }) + } + this.saveLoading = false + }) + }, + removeDetail(row) { + this.$confirm("此操作将永久移除该条数据,是否继续", "提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(res => { + let param = { + compareId: row.compareId, + productId: row.productId, + mainAction: row.mainAction, + batchNo: row.batchNo + } + stockCompareDetailDel(param).then(res => { + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.$message.success(res.message) + this.stockCompareDetailQuery.page = 1 + this.getStockCompareDetailList() + }) + }) + }, + del(row) { + this.$confirm("此操作将永久删除该条数据,是否继续", "提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(res => { + stockCompareDelete(row.id).then(res => { + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.filterQuery.page = 1 + this.getList() + }) + }) + }, + edit(row) { + this.compareId = row.id + this.editRow = row + this.saveLoading = false + this.param = { + thrSysId: row.thrSysId, + invCode: row.invCode, + action: row.action, + mainAction: row.mainAction, + compareDate: [row.compareStartDate, row.compareEndDate], + compareStartDate: row.compareStartDate, + compareEndDate: row.compareEndDate, + remark: row.remark + } + this.showDialog = true + this.stockCompareDetailQuery.page = 1 + this.stockCompareDetailQuery.limit = 10 + this.stockCompareDetailQuery.compareId = this.compareId + this.getStockCompareDetailList() + }, + add() { + this.param = {...param} + this.compareId = null + this.editRow = null + this.showDialog = true + this.saveLoading = false + }, + hideSearch() { + this.showSearch = !this.showSearch + }, + onReset() { + this.showSearch = true + this.filterQuery = {...filterQuery} + }, + onSubmit() { + this.filterQuery.page = 1 + this.getList() + }, + getList() { + this.loading = true + stockComparePage(this.filterQuery).then(res => { + this.loading = false + if (res.code != 20000) { + this.$message.error(res.message) + return + } + this.list = res.data.list || [] + this.total = res.data.total || 0 + }).catch(res => { + this.loading = false + }) + } + } +} diff --git a/src/views/inventory/stockCompare.vue b/src/views/inventory/stockCompare.vue new file mode 100644 index 00000000..5d2fe8ae --- /dev/null +++ b/src/views/inventory/stockCompare.vue @@ -0,0 +1,293 @@ +<template> + <div> + <el-card> + <el-form :model="filterQuery" class="query-form" size="mini" label-width="auto" v-show="showSearch"> + <el-row> + <el-col :span="6"> + <el-form-item class="query-form-item" label="记录号:"> + <el-input v-model="filterQuery.id" placeholder="请输入记录号" + style="width: 90%"></el-input> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item class="query-form-item" label="状态:"> + <el-select v-model="filterQuery.status" @clear="filterQuery.status=null" placeholder="请选择状态" style="width: 90%" clearable> + <el-option v-for="item in stockCompareStatusEnum" :key="item.key" :label="item.desc" :value="item.key"/> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item class="query-form-item" label="备注描述:"> + <el-input v-model="filterQuery.remark" clearable placeholder="请输入备注描述" style="width: 90%"/> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item class="query-form-item" label="第三方系统:"> + <thirdSysSelect :value.sync="filterQuery.thrSysId"/> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item class="query-form-item" label="所属仓库:"> + <invSelect :value.sync="filterQuery.invCode"/> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item class="query-form-item" label="出入库类型:"> + <mainActionSelect :value.sync="filterQuery.mainAction"/> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item class="query-form-item" label="单据类型:"> + <actionSelect :value.sync="filterQuery.action" :mainAction="filterQuery.mainAction" + :invCode="filterQuery.invCode"/> + </el-form-item> + </el-col> + </el-row> + </el-form> + <div class="top-right-btn"> + <el-button-group> + <el-button icon="el-icon-view" type="primary" @click="hideSearch">显示/隐藏搜索栏</el-button> + <el-button + type="primary" + icon="el-icon-refresh" + @click="onReset" + >重置 + </el-button> + <el-button type="primary" icon="el-icon-search" @click="onSubmit" + >查询 + </el-button> + <el-button type="primary" icon="el-icon-plus" @click="add" + >添加 + </el-button> + </el-button-group> + </div> + <el-divider style="margin: 15px"></el-divider> + + <el-table + v-loading="loading" + :data="list" + style="width: 100%; margin-top: 20px" + highlight-current-row + border + max-height="300" + height="300"> + <el-table-column label="序号" width="50" type="index"></el-table-column> + <el-table-column label="记录号" width="160" prop="id"/> + <el-table-column label="备注描述" width="160" prop="remark"/> + <el-table-column label="状态" width="80" prop="statusDesc"/> + <el-table-column label="第三方系统" width="160" prop="thrSysName"/> + <el-table-column label="仓库" width="110" prop="invName"/> + <el-table-column label="对比日期区间" width="170"> + <template slot-scope="scope"> + {{ scope.row.compareStartDate }} 至 {{ scope.row.compareEndDate }} + </template> + </el-table-column> + <el-table-column label="出入库类型" width="110" prop="mainAction"> + <template slot-scope="scope"> + {{ mainActionMap[scope.row.mainAction] || '全部' }} + </template> + </el-table-column> + <el-table-column label="单据类型" width="110" prop="actionName"> + <template scope="scope"> + {{ scope.row.actionName || '未选择' }} + </template> + </el-table-column> + <el-table-column label="创建时间" width="160" prop="createTime"/> + <el-table-column label="对比时间" width="160" prop="compareTime"/> + <el-table-column label="操作人" width="110" prop="createUserName"/> + <el-table-column fixed="right" width="100" label="操作"> + <template slot-scope="scope"> + <el-button type="text" @click="edit(scope.row)">编辑</el-button> + <el-button type="text" @click="del(scope.row)">删除</el-button> + </template> + </el-table-column> + + </el-table> + <pagination + v-show="total>0" + :total="total" + :limit.sync="filterQuery.limit" + :page.sync="filterQuery.page" + @pagination="getList" + ></pagination> + </el-card> + + <el-dialog + append-to-body + :title="compareId?'编辑对比':'新增对比'" + :visible="true" + v-if="showDialog" + @close="showDialog = false;filterQuery.page = 1;getList()" + width="60%" + > + <el-card class="dialogCard"> + <el-form :model="param" ref="stockCompare" :disabled="compareId" :rules="paramRules" class="query-form" + size="mini" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item class="query-form-item" prop="thrSysId" label="第三方系统:"> + <thirdSysSelect :value.sync="param.thrSysId"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item class="query-form-item" prop="invCode" label="所属仓库:"> + <invSelect :value.sync="param.invCode"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item class="query-form-item" label="出入库类型:"> + <mainActionSelect :value.sync="param.mainAction"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item class="query-form-item" label="单据类型:"> + <actionSelect :value.sync="param.action" :mainAction="param.mainAction" :invCode="param.invCode"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item class="query-form-item" prop="compareDate" label="对比时间:"> + <el-date-picker + style="width: 90%" + v-model="param.compareDate" + type="daterange" + align="right" + unlink-panels + value-format="yyyy-MM-dd" + range-separator="至" + start-placeholder="开始日期" + end-placeholder="结束日期" + :picker-options="pickerOptions"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item class="query-form-item" label="备注描述:" prop="remark"> + <el-input class="w90-percent" type="textarea" v-model="param.remark" + :autosize="{minRows: 2, maxRows: 6}" show-word-limit clearable :maxlength="500"/> + </el-form-item> + </el-col> + </el-row> + <el-row v-if="!compareId"> + <el-col align="center"> + <el-button @click="saveStockCompare" :loading="saveLoading" type="primary">下一步</el-button> + </el-col> + </el-row> + </el-form> + </el-card> + <el-card v-if="compareId" class="dialogSecCard"> + <el-row v-if="editRow&&editRow.status==stockCompareStatusEnum.DRAFT.key"> + <el-col align="right"> + <el-button icon="el-icon-refresh" @click="stockCompareDetailQuery.page=1;getStockCompareDetailList()">刷新 + </el-button> + <el-button type="primary" @click="showAddProduct">添加产品</el-button> + <el-button type="primary" @click="compareFunc">立即对比</el-button> + </el-col> + </el-row> + <el-row style="margin-top: 10px"> + <el-table v-loading="stockCompareDetailLoading" + :data="stockCompareDetailList" + highlight-current-row + max-height="300" + height="300"> + <el-table-column label="序号" width="50" type="index"/> + <el-table-column label="最小销售标识" width="110" prop="nameCode"/> + <el-table-column label="产品名称" width="110" prop="productName"/> + <el-table-column label="规格型号" width="110" prop="ggxh"/> + <el-table-column label="出入库类型" width="90" prop="mainAction"> + <template scope="scope"> + {{ mainActionMap[scope.row.mainAction] }} + </template> + </el-table-column> + <el-table-column label="数量" width="80" prop="count"/> + <el-table-column label="产品描述" width="110" prop="cpms"/> + <el-table-column label="生产厂家" width="110" prop="manufactory"/> + <el-table-column label="医疗器械注册/备案人名称" width="220" prop="ylqxzcrbarmc"/> + <el-table-column label="注册证/备案批准编号" width="220" prop="zczbhhzbapzbh"/> + <el-table-column label="操作" v-if="editRow&&editRow.status==stockCompareStatusEnum.DRAFT.key" width="80" + fixed="right"> + <template scope="scope"> + <el-button type="text" @click="removeDetail(scope.row)">移除</el-button> + </template> + </el-table-column> + </el-table> + <pagination + v-show="stockCompareDetailTotal>0" + :total="stockCompareDetailTotal" + :limit.sync="stockCompareDetailQuery.limit" + :page.sync="stockCompareDetailQuery.page" + @pagination="getList" + ></pagination> + </el-row> + </el-card> + + </el-dialog> + + <el-dialog + :visible="showAddProductDialog" + v-if="showAddProductDialog" + width="60%" + @close="showAddProductDialog=false" + > + <el-card> + <template slot="header"> + <el-row> + <el-col :span="12" align="left">选择产品</el-col> + <el-col :span="12" align="right"> + <el-button icon="el-icon-refresh" @click="selectProductQuery.page = 1;selectInvProductDetailList()">刷新 + </el-button> + <el-button icon="el-icon-check" type="primary" :disabled="!checkProductList.length" + @click="checkProduct(false)">选中选入 + </el-button> + <el-button icon="el-icon-check" type="primary" @click="checkProduct(true)">结果全部选入</el-button> + </el-col> + </el-row> + </template> + <el-table + v-loading="productLoading" + :data="productList" + ref="addProductTable" + style="width: 100%; margin-top: 20px" + @selection-change="addProductSelectionChange" + @row-click="(row)=>{this.$refs.addProductTable.toggleRowSelection(row)}" + max-height="300" + height="300" + > + <el-table-column label="" width="50" type="selection"/> + <!-- <el-table-column label="序号" width="50" type="index"/>--> + <el-table-column label="最小销售标识" width="120" prop="nameCode"/> + <el-table-column label="产品名称" width="120" prop="cpmctymc"/> + <el-table-column label="规格型号" width="120" prop="ggxh"/> + <el-table-column label="出入库类型" width="90" prop="mainAction"> + <template slot-scope="scope"> + {{ mainActionMap[scope.row.mainAction] }} + </template> + </el-table-column> + <el-table-column label="数量" width="80" prop="count"/> + <el-table-column label="产品描述" width="120" prop="cpms"/> + <el-table-column label="生产厂家" width="110" prop="manufactory"/> + <el-table-column label="医疗器械注册/备案人名称" width="220" prop="ylqxzcrbarmc"/> + <el-table-column label="注册证/备案批准编号" width="220" prop="zczbhhzbapzbh"/> + </el-table> + <pagination + v-show="productTotal>0" + :total="productTotal" + :limit.sync="selectProductQuery.limit" + :page.sync="selectProductQuery.page" + @pagination="selectInvProductDetailList" + ></pagination> + </el-card> + </el-dialog> + </div> +</template> + +<script src="./stockCompare.js"/> +<style></style> +<style scoped> +.dialogCard { + margin: -30px -5px 0px; +} + +.dialogSecCard { + margin: 5px -5px -10px; +} +</style>