فهرست منبع

feat: 销售发货确认审批

liujt 2 ماه پیش
والد
کامیت
6df9f79920

+ 8 - 0
pages.json

@@ -118,6 +118,14 @@
 				"navigationBarTextStyle": "white"
 			}
 		},
+		{ // 销售发货确认
+			"path": "pages/home/wt/components/salesInvoiceConfirm/processTask",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "white"
+			}
+		},
 		{
 			"path": "pages/home/wt/components/businessOpportunity/processTask",
 			"style": {

+ 14 - 0
pages/home/wt/components/common/commonProductList.vue

@@ -35,6 +35,7 @@ export default {
 			type: Array,
 			default: () => [
 				{ label: '类型', field: 'productCategoryName' },
+				{ label: '批次号', field: 'batchNo' },
 				// { label: '名称', field: 'productName' },
 				{ label: '计价方式', field: 'pricingWay', type: 'pricingWay' },
 				// { label: '编码', field: 'productCode' },
@@ -42,6 +43,8 @@ export default {
 				{ label: '牌号', field: 'brandNo' },
 				{ label: '客户代号', field: 'customerMark' },
 				{ label: '包装规格', field: 'packingSpecification' },
+				{ label: '机型', field: 'modelKey' },
+				{ label: '颜色', field: 'colorKey' },
 				{ label: '价格类型', field: 'goodsPriceType', type: 'dict', dictName: '商品价格类型' },
 				{ label: '单价', field: 'singlePrice' },
 				{ label: '折让单价', field: 'discountSinglePrice' },
@@ -95,6 +98,17 @@ export default {
 				const found = this.pricingWayList.find(p => p.id === value)
 				return found ? found.name : '-'
 			}
+			// 收货状态特殊处理
+			if (field.field === 'isException') {
+				return value == 1 ? '有异常' : '无异常'
+			}
+			if (field.field === 'packingQuantity') { 
+				const unit = item.packingUnit || ''
+				return value ? value + (unit ? ' ' + unit : '') : '-'
+			}
+			if (field.field === 'type') {
+				return value == 1 ? '已回收' : '未回收'
+			}
 			// 字典类型处理
 			if (field.type === 'dict') {
 				return this.getDictValue(field.dictName, value) || '-'

+ 186 - 0
pages/home/wt/components/salesInvoiceConfirm/processTask.vue

@@ -0,0 +1,186 @@
+<template>
+	<view class="havedone-container">
+		<uni-nav-bar fixed="true" statusBar="true" left-icon="back" :title="uniNavBarTitle"
+		 background-color="#157A2C" color="#fff"
+			@clickLeft="back"></uni-nav-bar>
+			<!-- <iframe src="http://aiot.zoomwin.com.cn:51001/test/a.html" style="width: 200px;height: 600px" frameborder="0"></iframe> -->
+		<view v-if="processInstance.processDefinition">
+			<taskForm id='async-biz-form-component' :taskId="listData.taskId" :businessId="listData.businessId" :id="listData.id"
+				:taskDefinitionKey="listData.taskDefinitionKey"
+				 ref="bziRef"></taskForm>
+				 
+		</view>
+		<view v-for="(item, index) in runningTasks" :key="index">
+			<div v-if="processInstance.processDefinition">
+				<taskSubmit id='async-sub-form-component' :taskId="listData.taskId" :businessId="listData.businessId" :id="listData.id"
+					:taskDefinitionKey="listData.taskDefinitionKey" @handleAudit="handleAudit"
+					@getTableValue="getTableValue" @handleUpdateAssignee="handleUpdateAssignee(item)"
+					@handleBackList="handleBackList(item)" ref="subForm">
+				</taskSubmit>
+			</div>
+		</view>
+		<u-toast ref="uToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	import {
+		getProcessInstance,
+		getTaskListByProcessInstanceId
+	} from '@/api/wt/index.js'
+import Vue from 'vue'
+import taskForm from './taskForm.vue'
+import taskSubmit from './taskSubmit.vue'
+
+	export default {
+		name: 'processTask',
+		components:{ taskForm,taskSubmit },
+		data() {
+			return {
+				uniNavBarTitle: '',
+				processInstanceLoading: false,
+				listData: {},
+				processInstance: {},
+				runningTasks: [],
+				auditForms: [],
+				activeComp: null,
+			}
+		},
+
+		onLoad(option) {
+			this.listData = option
+			this.getDetail()
+			 this.activeComp = 'tab1'
+		},
+		methods: {
+			/** 获得流程实例 */
+		async	getDetail() {
+				// 获得流程实例相关
+				this.processInstanceLoading = true;
+				getProcessInstance({
+					id: this.listData.id
+				}).then(async (response) => {
+					if (!response) {
+						this.$message.error('查询不到流程信息!');
+						return;
+					}
+					// 设置流程信息 
+						this.processInstance = response;
+					this.uniNavBarTitle =`${ response.name } 【${ response.startUser?.nickname}】`
+						
+			
+					// //将业务表单,注册为动态组件
+					// Vue.component('async-biz-form-component', (resolve) => {
+					// 	require(['pages/home' + this.listData.miniHandleRouter], resolve);
+					// });
+					// Vue.component('async-sub-form-component', (resolve) => {
+					// 	require(['pages/home' + this.listData.miniViewRouter], resolve);
+					// });
+					
+				
+					this.processInstanceLoading = false;
+				});
+
+				this.runningTasks = [];
+				this.auditForms = [];
+				getTaskListByProcessInstanceId({
+					processInstanceId: this.listData.id
+				}).then((response) => {
+					console.log(response, 'response');
+					// 审批记录
+					this.tasks = [];
+					// 移除已取消的审批
+					response.forEach((task) => {
+						if (task.result !== 4) {
+							this.tasks.push(task);
+						}
+					});
+					// 排序,将未完成的排在前面,已完成的排在后面;
+					this.tasks.sort((a, b) => {
+						// 有已完成的情况,按照完成时间倒序
+						if (a.endTime && b.endTime) {
+							return b.endTime - a.endTime;
+						} else if (a.endTime) {
+							return 1;
+						} else if (b.endTime) {
+							return -1;
+							// 都是未完成,按照创建时间倒序
+						} else {
+							return b.createTime - a.createTime;
+						}
+					});
+
+					// 需要审核的记录
+					let userInfo = wx.getStorageSync("userInfo");
+					this.tasks.forEach((task) => {
+						if (task.result !== 1 && task.result !== 6) {
+							// 只有待处理才需要
+							return;
+						}
+						if (!task.assigneeUser || task.assigneeUser.id !== userInfo.userId) {
+							// 自己不是处理人
+							return;
+						}
+						if (task.taskDefinitionKey !== this.listData.taskDefinitionKey) {
+							// 不是当前流程的
+							return;
+						}
+						this.runningTasks.push({
+							...task
+						});
+						console.log(this.runningTasks, ' this.runningTasks');
+						this.auditForms.push({
+							reason: ''
+						});
+					});
+				});
+			},
+
+
+			/** 处理审批通过和不通过的操作 */
+			handleAudit(data) {
+				let text = data.status === 1 ? '通过' : '不通过';
+				this.$refs.uToast.show({
+					type: 'success',
+					message: `审批${data.title || text}成功!`,
+					iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/success.png'
+				})
+				// 获得最新详情
+				setTimeout(() => {
+				
+					uni.navigateBack()
+				}, 1000)
+
+
+				// const index = this.runningTasks.indexOf(task);
+				// this.$refs['form' + index][0].validate((valid) => {
+				//   if (!valid) {
+				//     return;
+				//   }
+				//   const data = {
+				//     id: task.id,
+				//     reason: this.auditForms[index].reason
+				//   };
+				//   if (pass) {
+				//     approveTask(data).then((response) => {
+				//       this.$message.success('审批通过成功!');
+				//       this.handleClose(); // 获得最新详情
+				//     });
+				//   } else {
+				//     rejectTask(data).then((response) => {
+				//       this.$message.success('审批不通过成功!');
+				//       this.handleClose(); // 获得最新详情
+				//     });
+				//   }
+				// });
+			},
+			getTableValue(fn) {
+				fn(this.$refs.bziRef.getTableValue());
+			}
+		}
+
+	}
+</script>
+
+<style>
+</style>

+ 147 - 0
pages/home/wt/components/salesInvoiceConfirm/taskForm.vue

@@ -0,0 +1,147 @@
+<template>
+	<view class="">
+		<u-sticky offset-top="50">
+			<u-subsection fontSize='25' mode='subsection' :list="list" :current="curNow" @change="sectionChange"
+				activeColor='#157A2C'></u-subsection>
+		</u-sticky>
+		<view v-show='curNow===0'>
+			<u--form style="margin: 0 20px;" labelPosition="left" :model="form" ref="uForm" labelWidth='200rpx'>
+				<u-form-item label="客户名称" prop="contactName" borderBottom>
+					{{ form.contactName || '-' }}
+				</u-form-item>
+				<u-form-item label="车牌号" prop="plateNo" borderBottom>
+					{{ form.plateNo || '-' }}
+				</u-form-item>
+				<u-form-item label="客户联系人" prop="linkName" borderBottom>
+					{{ form.linkName || '-' }}
+				</u-form-item>
+				<u-form-item label="发货确认单编码" prop="docNo" borderBottom>
+					{{ form.docNo || '-' }}
+				</u-form-item>
+				<u-form-item label="客户电话" prop="linkPhone" borderBottom>
+					{{ form.linkPhone || '-' }}
+				</u-form-item>
+				<u-form-item label="制单人" prop="makerName" borderBottom>
+					{{ form.makerName || '-' }}
+				</u-form-item>
+				<u-form-item label="客户地址" prop="receiveAddress" borderBottom>
+					{{ form.receiveAddress || '-' }}
+				</u-form-item>
+				<u-form-item label="订单编码" prop="orderNo" borderBottom>
+					{{ form.orderNo || '-' }}
+				</u-form-item>
+				<u-form-item label="发货附件" prop="sendFiles" borderBottom>
+					<fileMain v-model="form.sendFiles" type="view"></fileMain>
+				</u-form-item>
+				<u-form-item label="发货单编码" prop="sendNo" borderBottom>
+					{{ form.sendNo || '-' }}
+				</u-form-item>
+				<u-form-item label="回执附件" prop="repliedFiles" borderBottom>
+					<fileMain v-model="form.repliedFiles" type="view"></fileMain>
+				</u-form-item>
+				<u-form-item label="是否回执" prop="replied" borderBottom>
+					{{ form.replied == 1 ? '是' : '否' }}
+				</u-form-item>
+				<u-form-item label="审核状态" prop="reviewStatus" borderBottom>
+					{{ form.reviewStatus || '-' }}
+				</u-form-item>
+			</u--form>
+		</view>
+		<view v-show='curNow===1'>
+			<common-product-list :list="form.productList" :tableField="tableField"></common-product-list>
+		</view>
+		<view v-show='curNow===2'>
+			<common-product-list :list="form.trayList" :tableField="trayField"></common-product-list>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		saleordersendconfirmInfo
+	} from '@/api/saleManage/saleorder/index.js'
+	import fileMain from "@/pages/doc/index.vue"
+	import commonProductList from "../common/commonProductList.vue"
+	import {transactionMethodsOp,shippingModeOp,shippingModePurchaseOp, pricingWayList, levelList, quoteTypeOp} from '@/enum/dict.js'
+	export default {
+		components: {
+			fileMain,
+			commonProductList
+		},
+		props: {
+			businessId: {
+				default: ''
+			},
+			taskDefinitionKey: {
+				default: ''
+			},
+		},
+		computed: {
+	
+		},
+		data() {
+			return {
+				form: {},
+				list: ['基本信息', '物品清单', '托盘清单'],
+				curNow: 0,
+				tableField: [
+					{ label: '类型', field: 'productCategoryName' },
+					{ label: '批次号', field: 'batchNo' },
+					{ label: '发货条码', field: 'barcodes' },
+					{ label: '物料代号', field: 'materielDesignation' },
+					{ label: '客户代号', field: 'clientCode' },
+					{ label: '计价方式', field: 'pricingWay', type: 'pricingWay' },
+					{ label: '包装编码', field: 'packageNo' },
+					{ label: '包装数量', field: 'packingQuantity' },
+					{ label: '规格', field: 'specification' },
+					{ label: '牌号', field: 'brandNo' },
+					{ label: '客户代号', field: 'customerMark' },
+					{ label: '刻码', field: 'engrave' },
+					{ label: '包装规格', field: 'packingSpecification' },
+					{ label: '机型', field: 'modelKey' },
+					{ label: '颜色', field: 'colorKey' },
+					{ label: '价格类型', field: 'goodsPriceType', type: 'dict', dictName: '商品价格类型' },
+					{ label: '单价', field: 'singlePrice' },
+					{ label: '折让单价', field: 'discountSinglePrice' },
+					{ label: '单重', field: 'singleWeight' },
+					{ label: '总重', field: 'totalWeight' },
+					{ label: '增重重量', field: 'increaseTotalWeight' },
+					{ label: '发货数量', field: 'saleCount' },
+					{ label: '确认数量', field: 'totalCount' },
+					{ label: '税率', field: 'taxRate', unit: '%'},
+					{ label: '合计', field: 'totalPrice' },
+					{ label: '收货状态', field: 'isException' },
+				],
+				trayField: [
+					{ label: '批次号', field: 'batchNo' },
+					{ label: '发货条码', field: 'barcodes' },
+					{ label: '物料代号', field: 'materielDesignation' },
+					{ label: '客户代号', field: 'clientCode' },
+					{ label: '刻码', field: 'engrave' },
+					{ label: '包装编码', field: 'packageNo' },
+					{ label: '包装数量', field: 'packingQuantity' },
+					{ label: '计量数量', field: 'totalCount' },
+					{ label: '回收状态', field: 'type' },
+				],
+			}
+		},
+		async mounted() {
+			await this.getDetailData(this.businessId);
+		},
+		methods: {
+			sectionChange(index) {
+				this.curNow = index;
+			},
+			async getDetailData(id) {
+				const data = await saleordersendconfirmInfo(id);
+				this.form = data;
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.btnConcel {
+		margin-top: 20rpx;
+	}
+</style>

+ 165 - 0
pages/home/wt/components/salesInvoiceConfirm/taskSubmit.vue

@@ -0,0 +1,165 @@
+<template>
+	<view class="">
+		<u--form style="margin: 0 20px;" labelPosition="left" :model="form" :rules="rules" ref="uForm"
+			labelWidth='140rpx'>
+			<u-form-item label="审批建议" prop="reason" required>
+				<u--textarea style="width: 100%;" height='120' border='surround' placeholder="请输入审批建议"
+					v-model="form.reason"></u--textarea>
+			</u-form-item>
+		</u--form>
+		<view class="btnList">
+			<u-button style="width: 45%;margin-bottom: 10rpx;" :loading='loading' type="success" text="通过"
+				@click="handleAudit(1)">
+			</u-button>
+			<u-button style="width: 45%;" :loading='loading' type="error" text="驳回" @click="rejectTask(0)"></u-button>
+		</view>
+		<view class="btnConcel">
+			<u-button @click="showAction = true">更多</u-button>
+		</view>
+		<u-action-sheet :actions="actionList" :closeOnClickOverlay="true" :closeOnClickAction="true" title="更多操作" :show="showAction" @close="showAction = false" @select="selectActionClick"></u-action-sheet>
+	</view>
+</template>
+
+<script>
+	import {
+		approveTaskWithVariables,
+		rejectTask,
+		cancelTask
+	} from '@/api/wt/index.js'
+	export default {
+		name: 'taskSubmit',
+		props: {
+			businessId: {
+				default: ''
+			},
+			taskId: {
+				default: ''
+			},
+			id: {
+				default: ''
+			},
+			taskDefinitionKey: {
+				default: ''
+			}
+		},
+
+		data() {
+			return {
+				showAction: false,
+				loading: false,
+				actionList: [{
+					name: '作废',
+					fontSize: '28',
+					color: '#ffaa7f'
+				}],
+				form: {
+					technicianId: '',
+					reason: '同意',
+				},
+				rules: {
+					reason: {
+						type: 'string',
+						required: true,
+						message: '请输入审批建议',
+						trigger: 'blur'
+					}
+				}
+			}
+		},
+		mounted() {
+			this.$refs.uForm.setRules(this.rules)
+		},
+		methods: {
+			selectActionClick(item) {
+				console.log('selectActionClick', item)
+				if (item.name == '作废') {
+					uni.showModal({
+						title: '提示',
+						content: '是否确认作废?',
+						success: (res) => {
+							if (res.confirm) {
+								this.loading = true
+								cancelTask({
+									taskId: this.taskId,
+									id: this.id,
+									reason: this.form.reason,
+									businessId: this.businessId,
+								}).then(() => {
+									if (res.code != '-1') {
+										this.loading = false
+										this.$emit('handleAudit', {
+											title: '作废'
+										});
+									}
+								}).catch(() => {
+									this.loading = false
+									this.$message.error("流程作废失败");
+								});
+							} else if (res.cancel) {
+								console.log('用户点击取消');
+							}
+						}
+					});
+				}
+			},
+			async handleAudit(status) {
+				if (!!status) await this.$refs.uForm.validate()
+				this.loading = true
+				await this._approveTaskWithVariables(status);
+			},
+			async _approveTaskWithVariables(status) {
+				let variables = {
+					pass: !!status
+				};
+				let res = await approveTaskWithVariables({
+					id: this.taskId,
+					reason: this.form.reason,
+					variables
+				})
+
+				if (res.code != '-1') {
+					this.$emit('handleAudit', {
+						status,
+						title: status === 0 ? '驳回' : ''
+					});
+				}
+				this.loading = false
+			},
+			async rejectTask(status) {
+				let variables = {
+					pass: !!status
+				};
+				let res = await rejectTask({
+					id: this.taskId,
+					reason: this.form.reason,
+					variables
+				})
+
+				if (res.code != '-1') {
+					this.$emit('handleAudit', {
+						status,
+						title: status === 0 ? '驳回' : ''
+					});
+				}
+				this.loading = false
+			},
+			getTableValue() {
+				return new Promise((resolve, reject) => {
+					this.$emit('getTableValue', async (data) => {
+						resolve(await data);
+					});
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.btnList {
+		display: flex;
+
+	}
+	.btnConcel {
+		margin-top: 20rpx;
+	}
+</style>