feat(order): 添加送样日期校验和权限刷新机制
- 在委托单新增表单中为送样日期添加占位提示和保存校验
- 在检验审核、检验任务、报告编制、样品接收、报告结果、用印台账等页面添加送样时间列
- 加载委托模板时清空送样日期并清除校验状态
| | |
| | | // 根据角色ID查询菜单下拉树结构 |
| | | export function roleMenuTreeselect(roleId) { |
| | | return request({ |
| | | url: '/system/menu/roleMenuTreeselect/' + roleId, |
| | | url: roleId == null ? '/system/menu/roleMenuTreeselect' : '/system/menu/roleMenuTreeselect/' + roleId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | |
| | | url: '/system/menu/' + menuId, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | } |
| | |
| | | permissions: [] |
| | | }), |
| | | actions: { |
| | | // 更新按钮权限,不重复触发登录时的密码提示。 |
| | | async refreshPermissions() { |
| | | const token = this.token |
| | | const res = await getInfo() |
| | | if (this.token === token) { |
| | | this.roles = res.roles?.length ? res.roles : ['ROLE_DEFAULT'] |
| | | this.permissions = res.permissions || [] |
| | | } |
| | | return res |
| | | }, |
| | | // 登录 |
| | | login(userInfo) { |
| | | const username = userInfo.username.trim() |
| | |
| | | { label: '样品编号', prop: 'sampleCode' }, |
| | | { label: '检测项目', prop: 'inspectionItem', dataType: 'slot', slot: 'inspectionItem', width: '220px' }, |
| | | { label: '委托编号', prop: 'entrustCode' }, |
| | | { label: '送样时间', prop: 'sampleDate', width: '110px', formatData: value => value || '—' }, |
| | | { label: '方法标准', prop: 'methodStandard' }, |
| | | { label: '主检人签字', prop: 'mainInspectorName' }, |
| | | { label: '备注', prop: 'remark', dataType: 'slot', slot: 'remark', width: '180px' }, |
| | |
| | | tableData: [], |
| | | column: [ |
| | | { label: "检验报告编号", prop: "insReportCode" }, |
| | | { label: "送样时间", prop: "sampleDate", width: "110px", formatData: value => value || '—' }, |
| | | { label: "发往何处", prop: "send" }, |
| | | { label: "发送方式", prop: "method" }, |
| | | { label: "发送日期", prop: "sendTime" }, |
| | |
| | | linkMethod: "selectAllByOne", |
| | | }, |
| | | {label: "样品名称", prop: "sample", width: "160px"}, |
| | | {label: "送样时间", prop: "sampleDate", width: "110px", formatData: value => value || '—'}, |
| | | // { |
| | | // label: '物料属性', |
| | | // prop: 'materialProp', |
| | |
| | | linkMethod: "selectAllByOne", |
| | | }, |
| | | { label: "监控项目", prop: "monitorProject", width: "150px" }, |
| | | { label: "送样时间", prop: "sampleDate", width: "110px", formatData: value => value || '—' }, |
| | | { label: "计划期限", prop: "dueDate", width: "120px" }, |
| | | { label: "样品名称", prop: "sample", width: "160px" }, |
| | | { |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="送样日期" prop="sampleDate"> |
| | | <el-date-picker v-model="addObj.sampleDate" type="date" value-format="YYYY-MM-DD" :disabled="active>1" |
| | | <el-date-picker v-model="addObj.sampleDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择本次送样日期" :disabled="active>1" |
| | | size="small"/> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | } |
| | | }, |
| | | saveMethod(sampleList) { |
| | | if (!this.addObj.sampleDate && !this.isEdit) { |
| | | this.$refs.newJuOrder?.validateField('sampleDate') |
| | | this.$message.warning('请选择本次送样日期') |
| | | return |
| | | } |
| | | if (this.addObj.standardTreeId) { |
| | | this.saveData([]); |
| | | return; |
| | |
| | | } |
| | | }, |
| | | saveData(sampleList) { |
| | | if (!this.addObj.sampleDate && !this.isEdit) { |
| | | this.$refs.newJuOrder?.validateField('sampleDate') |
| | | this.$message.warning('请选择本次送样日期') |
| | | return |
| | | } |
| | | this.saveLoad = true |
| | | const insOrder = { |
| | | ...this.addObj, |
| | |
| | | }, |
| | | // 查询模板 |
| | | selectInsOrderTemplateById(e) { |
| | | const loadVersion = ++this.orderLoadVersion |
| | | selectInsOrderTemplateById({id: e}).then(res => { |
| | | if (loadVersion !== this.orderLoadVersion || this.template !== e) return |
| | | const detail = res.data || {} |
| | | let obj = JSON.parse(detail.thing) |
| | | //制单人设置为当前登录用户 |
| | | let user = this.nickName |
| | | obj.addObj.custom = user.name |
| | | obj.addObj.userId = user.userId |
| | | this.addObj = obj.addObj; |
| | | this.addObj = {...obj.addObj, sampleDate: null}; |
| | | this.$nextTick(() => this.$refs.newJuOrder?.clearValidate('sampleDate')) |
| | | this.sampleList = obj.sampleList; |
| | | this.selectTree = obj.selectTree |
| | | // backend already resolved the bound record templates by standard |
| | |
| | | <ul class="tab"> |
| | | <li :class="{ active: tabIndex === 7 }" v-if="checkPermi(['get:insOrder:all'])" @click="handleTab(7)">全部</li> |
| | | <li :class="{ active: tabIndex === 1 }" v-if="checkPermi(['get:insOrder:checkout'])" @click="handleTab(1)">检验中</li> |
| | | <li :class="{ active: tabIndex === 2 }" v-if="checkPermi(['get:insOrder:customerOrdered'])" @click="handleTab(2)">委托已检</li> |
| | | <li :class="{ active: tabIndex === 2 }" v-if="checkPermi(['get:insOrder:customerOrdered'])" @click="handleTab(2)">已检</li> |
| | | <li :class="{ active: tabIndex === 4 }" v-if="checkPermi(['get:insOrder:sendBack'])" @click="handleTab(4)">退回</li> |
| | | <li :class="{ active: tabIndex === 5 }" v-if="checkPermi(['get:insOrder:revocation'])" @click="handleTab(5)">撤销</li> |
| | | <li :class="{ active: tabIndex === 6 }" v-if="checkPermi(['get:insOrder:revocation'])" @click="handleTab(6)">作废</li> |
| | |
| | | } from "@/api/business/productOrder"; |
| | | import { downFile, getFileList } from "@/api/business/rawMaterialOrder"; |
| | | import {mapGetters} from "@/utils/store-compat"; |
| | | import useUserStore from '@/store/modules/user' |
| | | export default { |
| | | name: 'ProductOrder', |
| | | components: { |
| | |
| | | this.handleDelete(row); |
| | | }, |
| | | showHide: (row) => { |
| | | return this.tabIndex === 4 || this.tabIndex === 5 |
| | | return this.checkPermi(['delete:insOrder']) |
| | | } |
| | | }, |
| | | { |
| | |
| | | value: 1 |
| | | }, |
| | | { |
| | | label: '委托已检', |
| | | label: '已检', |
| | | value: 4 |
| | | }, |
| | | { |
| | |
| | | ...mapGetters(["nickName"]), |
| | | }, |
| | | mounted() { |
| | | useUserStore().refreshPermissions().catch(() => {}) |
| | | // 免审核后没有待审核页签,默认进入全部 |
| | | this.tabIndex = this.checkPermi(['get:insOrder:all']) ? 7 : 1 |
| | | this.refreshTable() |
| | | }, |
| | | activated() { |
| | | useUserStore().refreshPermissions().catch(() => {}) |
| | | this.refreshTable() |
| | | }, |
| | | methods: { |
| | | // 查询列表数据 |
| | | refreshTable() { |
| | | if (this.tabIndex !== 2 && this.tabIndex !== 3) { |
| | | this.entity.orderType = '' |
| | | } else { |
| | | if (this.tabIndex === 2) { |
| | | this.entity.orderType = 'Customer-ordered test' |
| | | } else { |
| | | this.entity.orderType = '抽检' |
| | | } |
| | | } |
| | | // 已检按报告批准后的订单状态查询,不限制检验类别。 |
| | | this.entity.orderType = this.tabIndex === 3 ? '抽检' : '' |
| | | const params = { ...this.entity, state: this.tabList[this.tabIndex].value } |
| | | this.isLoading = true; // 开始加载 |
| | | selectInsOrderParameter({...this.page,...params}).then(res => { |
| | |
| | | this.InspectionKey++ |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm('是否删除当前数据?', "警告", { |
| | | confirmButtonText: "确定", |
| | | if (!this.checkPermi(['delete:insOrder'])) return |
| | | this.$confirm(`确定永久删除委托单“${row.entrustCode || row.code || row.id}”吗?该委托的样品接收、检验任务、原始记录、报告(含已批准报告)、附件记录及其他关联业务记录将一并删除,删除后无法恢复。`, "删除委托单", { |
| | | confirmButtonText: "确认删除", |
| | | cancelButtonText: "取消", |
| | | type: "warning" |
| | | }).then(() => { |
| | | delInsOrder({ insOrderId: row.id }).then(res => { |
| | | return delInsOrder({ insOrderId: row.id }).then(res => { |
| | | this.multipleSelection = this.multipleSelection.filter(item => item.id !== row.id) |
| | | this.$message.success('删除成功') |
| | | this.refreshTable() |
| | | }).catch(e => { |
| | | this.$message.error('删除失败') |
| | | }) |
| | | }).catch(() => { }) |
| | | } |
| | |
| | | }, |
| | | }, |
| | | {label: "创建时间", prop: "createTime"}, |
| | | {label: "送样时间", prop: "sampleDate", width: "110px", formatData: value => value || '—'}, |
| | | {label: "提交人", prop: "writeUserName"}, |
| | | {label: "提交时间", prop: "writeTime"}, |
| | | { |
| | |
| | | { label: '印章名称', prop: 'sealNames', dataType: 'slot', slot: 'sealNames', minWidth: '210px' }, |
| | | { label: '检测项目名称', prop: 'projectName', dataType: 'slot', slot: 'projectName', minWidth: '180px' }, |
| | | { label: '报告编号', prop: 'reportCode', minWidth: '180px' }, |
| | | { label: '送样时间', prop: 'sampleDate', width: '110px', formatData: value => value || '—' }, |
| | | { label: '份数', prop: 'copies', dataType: 'slot', slot: 'copies', width: '120px' }, |
| | | { label: '用印人签字', prop: 'useUserName', width: '140px' } |
| | | ] |
| | |
| | | |
| | | <script setup name="Role"> |
| | | import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role" |
| | | import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu" |
| | | import { roleMenuTreeselect } from "@/api/system/menu" |
| | | import useUserStore from '@/store/modules/user' |
| | | |
| | | const router = useRouter() |
| | | const { proxy } = getCurrentInstance() |
| | |
| | | |
| | | /** 查询菜单树结构 */ |
| | | function getMenuTreeselect() { |
| | | menuTreeselect().then(response => { |
| | | menuOptions.value = response.data |
| | | roleMenuTreeselect().then(response => { |
| | | menuOptions.value = response.menus |
| | | }) |
| | | } |
| | | |
| | |
| | | if (form.value.roleId != undefined) { |
| | | form.value.menuIds = getMenuAllCheckedKeys() |
| | | updateRole(form.value).then(() => { |
| | | useUserStore().refreshPermissions().catch(() => {}) |
| | | proxy.$modal.msgSuccess("修改成功") |
| | | open.value = false |
| | | getList() |