|
@@ -0,0 +1,366 @@
|
|
|
+<template>
|
|
|
+ <view class="page-detail">
|
|
|
+ <view class="page-center">
|
|
|
+ <uni-section title="清单名称" type="line"></uni-section>
|
|
|
+ <text style="padding-left: 20rpx">{{ version.version_name }}</text>
|
|
|
+
|
|
|
+ <!-- 表单数据 -->
|
|
|
+ <template v-if="formList.length > 0">
|
|
|
+ <uni-section title="表单数据" type="line"></uni-section>
|
|
|
+ <uni-forms class="form" label-align="right" :labelWidth="100">
|
|
|
+ <uni-forms-item
|
|
|
+ v-for="item in formList"
|
|
|
+ :label="item.name"
|
|
|
+ name="email"
|
|
|
+ >
|
|
|
+ <view class="content">{{ item.value.join(",") }}</view>
|
|
|
+ </uni-forms-item>
|
|
|
+ </uni-forms>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 附件信息 -->
|
|
|
+ <template v-if="excelFileList.length > 0">
|
|
|
+ <uni-section title="附件信息" type="line"></uni-section>
|
|
|
+ <view class="attachment" v-for="item in excelFileList" :key="item.id">
|
|
|
+ <!-- {{item.name}} -->
|
|
|
+ <previewFile :src="item.url" :name="item.name" />
|
|
|
+ </view>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 审批信息 -->
|
|
|
+ <uni-section title="审批信息" type="line"></uni-section>
|
|
|
+ <uni-steps
|
|
|
+ :options="flow.list.FlowNodes"
|
|
|
+ :active="flow.current"
|
|
|
+ direction="column"
|
|
|
+ ></uni-steps>
|
|
|
+
|
|
|
+ <!-- 清单详情 -->
|
|
|
+ <uni-section title="清单详情" type="line"></uni-section>
|
|
|
+ <view class="excel-detail" @click="toExcelDetail">查看详情</view>
|
|
|
+ <!-- 审批按钮 -->
|
|
|
+ <view class="btns" v-if="isAuditor">
|
|
|
+ <button type="primary" @click="showAuditModal">通过</button>
|
|
|
+ <button type="warn" @click="showRejectModal">拒绝</button>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <!-- 审核通过弹窗 -->
|
|
|
+ <uni-popup ref="popup" type="dialog">
|
|
|
+ <uni-popup-dialog
|
|
|
+ type="info"
|
|
|
+ mode="base"
|
|
|
+ title="审批"
|
|
|
+ content="是否通过审批"
|
|
|
+ :duration="2000"
|
|
|
+ :before-close="true"
|
|
|
+ @close="auditClose"
|
|
|
+ @confirm="auditConfirm"
|
|
|
+ ></uni-popup-dialog>
|
|
|
+ </uni-popup>
|
|
|
+
|
|
|
+ <!-- 审批拒绝弹窗 -->
|
|
|
+ <uni-popup ref="rejectPopup" type="dialog">
|
|
|
+ <uni-popup-dialog
|
|
|
+ mode="input"
|
|
|
+ placeholder="请输入拒绝原因"
|
|
|
+ :duration="2000"
|
|
|
+ :before-close="true"
|
|
|
+ @close="rejectClose"
|
|
|
+ @confirm="rejectConfirm"
|
|
|
+ ></uni-popup-dialog>
|
|
|
+ </uni-popup>
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import {
|
|
|
+ queryAttachment,
|
|
|
+ queryAuditList,
|
|
|
+ approve,
|
|
|
+ queryCheckedVersionDetail,
|
|
|
+} from "@/services/bom.js";
|
|
|
+import { gerCurrentUser } from "@/services/user.js";
|
|
|
+import previewFile from "@/components/preview-file/preview-file.vue";
|
|
|
+
|
|
|
+export default {
|
|
|
+ components: {
|
|
|
+ previewFile,
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ formList() {
|
|
|
+ if (!this.version.formStr && !this.version.ding_schema) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ if (this.version.formStr) {
|
|
|
+ try {
|
|
|
+ const formStrArray = JSON.parse(this.version.formStr);
|
|
|
+ const formComponents = [];
|
|
|
+ if (formStrArray && formStrArray.length) {
|
|
|
+ formStrArray.forEach((item) => {
|
|
|
+ formComponents.push(JSON.parse(item));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ const formComponent = formComponents.filter(
|
|
|
+ (item) => item.template_node_id === this.version.template_node_id
|
|
|
+ );
|
|
|
+ console.log(formComponent);
|
|
|
+ return formComponent[0].formComponentValues || [];
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (this.version.ding_schema) {
|
|
|
+ try {
|
|
|
+ const formStrArray = JSON.parse(this.version.ding_schema);
|
|
|
+ const formComponents = [];
|
|
|
+ if (formStrArray && formStrArray.length) {
|
|
|
+ formStrArray.forEach((item) => {
|
|
|
+ formComponents.push(JSON.parse(item));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ const formComponent = formComponents.filter(
|
|
|
+ (item) => item.template_node_id === this.version.template_node_id
|
|
|
+ );
|
|
|
+ return (
|
|
|
+ formComponent[0].formComponentValues.filter(
|
|
|
+ (item) => !item.id.includes("DIYTable")
|
|
|
+ ) || []
|
|
|
+ );
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ projectId: 580,
|
|
|
+ templateNodeId: 0,
|
|
|
+ id: 0,
|
|
|
+ version: {},
|
|
|
+ excelFileList: [],
|
|
|
+ auditMessage: "",
|
|
|
+ flow: {
|
|
|
+ active: 0,
|
|
|
+ active_id: null,
|
|
|
+ current: 0,
|
|
|
+ currentNode: {},
|
|
|
+ list: {
|
|
|
+ FlowNodes: [],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ isAuditor: false,
|
|
|
+ isMobile: true,
|
|
|
+ options: {},
|
|
|
+ };
|
|
|
+ },
|
|
|
+ onLoad(options) {
|
|
|
+ this.templateNodeId = options.templateNodeId;
|
|
|
+ this.projectId = Number(options.projectId);
|
|
|
+ this.id = options.excel_id;
|
|
|
+ // 如果链接带着token, 则强制替换最新的token
|
|
|
+ if (options["JWT-TOKEN"]) {
|
|
|
+ uni.setStorageSync("token", options["JWT-TOKEN"]);
|
|
|
+ }
|
|
|
+ this.options = options;
|
|
|
+ this.checkDeviceType();
|
|
|
+ this.init();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ checkDeviceType() {
|
|
|
+ const userAgent = navigator.userAgent.toLowerCase();
|
|
|
+ const mobileKeywords = ["android", "iphone", "ipad", "ipod", "mobile"];
|
|
|
+ this.isMobile = mobileKeywords.some((keyword) =>
|
|
|
+ userAgent.includes(keyword)
|
|
|
+ );
|
|
|
+ return this.isMobile;
|
|
|
+ },
|
|
|
+
|
|
|
+ async init() {
|
|
|
+ var currentUser = await gerCurrentUser();
|
|
|
+ if (!currentUser) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ uni.setStorageSync("user", currentUser);
|
|
|
+
|
|
|
+ var version = await queryCheckedVersionDetail(this.id);
|
|
|
+ if (!this.isMobile) {
|
|
|
+ // 如果是在电脑上打开,转到PC端的页面去
|
|
|
+ window.location.href = `http://120.55.44.4:8896/#/bom/home/detail/${version.project_id}/${version.template_id}?excel_id=${this.id}&JWT-TOKEN=${this.options["JWT-TOKEN"]}`;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (version.flow_id) {
|
|
|
+ this.getFlow(version);
|
|
|
+ }
|
|
|
+ this.version = version;
|
|
|
+
|
|
|
+ if (version.attachment_id) {
|
|
|
+ var {
|
|
|
+ data: { list: excelFileList },
|
|
|
+ } = await queryAttachment({
|
|
|
+ excel_id: version.attachment_id,
|
|
|
+ });
|
|
|
+ this.excelFileList = excelFileList.map((item) => {
|
|
|
+ const list = item.url.split("/");
|
|
|
+ const name = list[list.length - 1];
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name,
|
|
|
+ };
|
|
|
+ });
|
|
|
+ // console.log(this.excelFileList)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ // 显示通过审批弹窗
|
|
|
+ async showAuditModal() {
|
|
|
+ this.$refs.popup.open();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 通过审批
|
|
|
+ async auditConfirm() {
|
|
|
+ let flow = this.flow;
|
|
|
+ let flowNode = flow.currentNode;
|
|
|
+ var { data: newVersion } = await approve({
|
|
|
+ id: flow.active_id,
|
|
|
+ project_id: this.projectId,
|
|
|
+ audit_status: 3,
|
|
|
+ flow_id: flowNode.flow_id,
|
|
|
+ node_id: flowNode.seq,
|
|
|
+ });
|
|
|
+ this.version = {
|
|
|
+ ...this.version,
|
|
|
+ id: newVersion.id,
|
|
|
+ };
|
|
|
+ this.getFlow(this.version);
|
|
|
+ uni.showToast({
|
|
|
+ title: "操作成功",
|
|
|
+ });
|
|
|
+ this.$refs.popup.close();
|
|
|
+ },
|
|
|
+
|
|
|
+ // 显示拒绝审批弹窗
|
|
|
+ showRejectModal() {
|
|
|
+ this.$refs.rejectPopup.open();
|
|
|
+ },
|
|
|
+
|
|
|
+ auditClose() {
|
|
|
+ this.$refs.popup.close();
|
|
|
+ },
|
|
|
+
|
|
|
+ rejectClose() {
|
|
|
+ this.$refs.rejectPopup.close();
|
|
|
+ },
|
|
|
+
|
|
|
+ async rejectConfirm(audit_comment) {
|
|
|
+ const flow = this.flow;
|
|
|
+ const flowNode = flow.currentNode;
|
|
|
+
|
|
|
+ var { data: newVersion } = await approve({
|
|
|
+ id: flow.active_id,
|
|
|
+ project_id: this.projectId,
|
|
|
+ audit_status: 2,
|
|
|
+ flow_id: flowNode.flow_id,
|
|
|
+ node_id: flowNode.seq,
|
|
|
+ audit_comment,
|
|
|
+ });
|
|
|
+ uni.showToast({
|
|
|
+ title: "操作成功",
|
|
|
+ });
|
|
|
+ this.version = {
|
|
|
+ ...this.version,
|
|
|
+ id: newVersion.id,
|
|
|
+ };
|
|
|
+ this.getFlow(this.version);
|
|
|
+ this.rejectClose();
|
|
|
+ },
|
|
|
+ // 查询审批信息
|
|
|
+ async getFlow(version) {
|
|
|
+ const { data: auditList } = await queryAuditList({
|
|
|
+ template_id: version.template_id,
|
|
|
+ template_node_id: version.template_node_id,
|
|
|
+ flow_id: version.flow_id,
|
|
|
+ version_id: version.version_id,
|
|
|
+ audit_series: version.audit_series,
|
|
|
+ });
|
|
|
+ if (auditList.length > 0) {
|
|
|
+ let item = auditList.find((item) => item.list.id == version.flow_id);
|
|
|
+ if (!item) return;
|
|
|
+ // 查询当前节点
|
|
|
+ let current = item.list.FlowNodes.findIndex(
|
|
|
+ (node) => node.seq == item.active
|
|
|
+ );
|
|
|
+ item.current = current == -1 ? 0 : current;
|
|
|
+ // 保存当前所处节点
|
|
|
+ item.currentNode = item.list.FlowNodes[item.current];
|
|
|
+ item.list.FlowNodes.forEach((item) => {
|
|
|
+ item.title = item.node;
|
|
|
+ item.desc = item.AuditRoleInfo
|
|
|
+ ? `审批人:${item?.AuditRoleInfo.Name || "-"}`
|
|
|
+ : `审批人:${item?.AuditorUser.CName || "-"}`;
|
|
|
+ });
|
|
|
+ this.flow = item;
|
|
|
+ // 判断是否含有审批权限
|
|
|
+ this.isAuditor = false;
|
|
|
+ if (item.active_audit == 1) {
|
|
|
+ let user = uni.getStorageSync("user");
|
|
|
+ if (item.currentNode && item.currentNode.auditor == user.ID) {
|
|
|
+ this.isAuditor = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ toExcelDetail() {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: `./excelDetail?templateNodeId=${this.templateNodeId}&versionId=${this.version.version_id}`,
|
|
|
+ });
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+.page-detail {
|
|
|
+ min-height: 100vh;
|
|
|
+ padding: 20rpx 30rpx 40rpx;
|
|
|
+ background: url("~@/static/index/bg.png") no-repeat center;
|
|
|
+ background-size: cover;
|
|
|
+ background-attachment: fixed;
|
|
|
+
|
|
|
+ .page-center {
|
|
|
+ padding: 30rpx;
|
|
|
+ padding-top: 0;
|
|
|
+ background-color: #fff;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.btns {
|
|
|
+ display: flex;
|
|
|
+ margin-top: 40rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.excel-detail {
|
|
|
+ color: #2f42ca;
|
|
|
+ text-decoration: underline;
|
|
|
+ padding-left: 20rpx;
|
|
|
+}
|
|
|
+
|
|
|
+.form {
|
|
|
+ width: 90%;
|
|
|
+ margin: 0;
|
|
|
+ box-shadow: 0 0 1 3 rgba(0, 0, 0, 0.1);
|
|
|
+
|
|
|
+ .content {
|
|
|
+ line-height: 44rpx;
|
|
|
+ padding: 14rpx;
|
|
|
+ word-break: break-all;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.attachment {
|
|
|
+ padding-left: 20rpx;
|
|
|
+ margin-bottom: 20rpx;
|
|
|
+}
|
|
|
+</style>
|