diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 904f69a77..a3ae11913 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -60,6 +60,7 @@ "pinia": "catalog:", "steady-xml": "catalog:", "tinymce": "catalog:", + "tyme4ts": "catalog:", "video.js": "catalog:", "vue": "catalog:", "vue-dompurify-html": "catalog:", diff --git a/apps/web-antd/src/api/iot/rule/scene/index.ts b/apps/web-antd/src/api/iot/rule/scene/index.ts index acbfbac42..23549f1ad 100644 --- a/apps/web-antd/src/api/iot/rule/scene/index.ts +++ b/apps/web-antd/src/api/iot/rule/scene/index.ts @@ -24,7 +24,7 @@ export namespace RuleSceneApi { operator?: string; value?: any; cronExpression?: string; - conditionGroups?: TriggerCondition[][]; + conditionGroups?: TriggerCondition[][]; // 后端结构:List>;外层「或」、组内「且」 } /** 场景联动规则的触发条件 */ @@ -80,13 +80,6 @@ export function deleteSceneRule(id: number) { return requestClient.delete(`/iot/scene-rule/delete?id=${id}`); } -/** 批量删除场景联动规则 */ -export function deleteSceneRuleList(ids: number[]) { - return requestClient.delete('/iot/scene-rule/delete-list', { - params: { ids: ids.join(',') }, - }); -} - /** 更新场景联动规则状态 */ export function updateSceneRuleStatus(id: number, status: number) { return requestClient.put(`/iot/scene-rule/update-status`, { diff --git a/apps/web-antd/src/api/iot/thingmodel/index.ts b/apps/web-antd/src/api/iot/thingmodel/index.ts index 2fb80be2e..88665ebc9 100644 --- a/apps/web-antd/src/api/iot/thingmodel/index.ts +++ b/apps/web-antd/src/api/iot/thingmodel/index.ts @@ -148,8 +148,8 @@ export const ThingModelFormRules: Record = { identifier: [ { required: true, message: '标识符不能为空', trigger: 'blur' }, { - pattern: /^\w{1,50}$/, - message: '支持大小写字母、数字和下划线,不超过 50 个字符', + pattern: /^[a-zA-Z][a-zA-Z0-9_]{0,31}$/, + message: '支持大小写字母、数字和下划线,必须以字母开头,不超过 32 个字符', trigger: 'blur', }, { diff --git a/apps/web-antd/src/api/mes/md/autocode/rule/index.ts b/apps/web-antd/src/api/mes/md/autocode/rule/index.ts index d33e6e0fc..6955e7304 100644 --- a/apps/web-antd/src/api/mes/md/autocode/rule/index.ts +++ b/apps/web-antd/src/api/mes/md/autocode/rule/index.ts @@ -51,7 +51,5 @@ export function deleteAutoCodeRule(id: number) { /** 导出编码规则 */ export function exportAutoCodeRule(params: PageParam) { - return requestClient.download('/mes/md/auto-code-rule/export-excel', { - params, - }); + return requestClient.download('/mes/md/auto-code-rule/export-excel', { params }); } diff --git a/apps/web-antd/src/api/mes/md/item/index.ts b/apps/web-antd/src/api/mes/md/item/index.ts index f2a23c0e6..9d3b107f8 100644 --- a/apps/web-antd/src/api/mes/md/item/index.ts +++ b/apps/web-antd/src/api/mes/md/item/index.ts @@ -34,9 +34,7 @@ export namespace MesMdItemApi { /** 查询物料产品分页 */ export function getItemPage(params: PageParam) { - return requestClient.get>('/mes/md/item/page', { - params, - }); + return requestClient.get>('/mes/md/item/page', { params }); } /** 查询物料产品详情 */ diff --git a/apps/web-antd/src/api/mes/pro/andon/config/index.ts b/apps/web-antd/src/api/mes/pro/andon/config/index.ts new file mode 100644 index 000000000..9309a0c8c --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/andon/config/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProAndonConfigApi { + /** MES 安灯配置 */ + export interface AndonConfig { + id?: number; // 编号 + reason?: string; // 呼叫原因 + level?: number; // 级别 + handlerRoleId?: number; // 处置角色编号 + handlerRoleName?: string; // 处置角色名称 + handlerUserId?: number; // 处置人编号 + handlerUserNickname?: string; // 处置人昵称 + remark?: string; // 备注 + } +} + +/** 查询安灯配置分页 */ +export function getAndonConfigPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/andon-config/page', + { params }, + ); +} + +/** 查询安灯配置列表 */ +export function getAndonConfigList() { + return requestClient.get( + '/mes/pro/andon-config/list', + ); +} + +/** 查询安灯配置详情 */ +export function getAndonConfig(id: number) { + return requestClient.get( + `/mes/pro/andon-config/get?id=${id}`, + ); +} + +/** 新增安灯配置 */ +export function createAndonConfig(data: MesProAndonConfigApi.AndonConfig) { + return requestClient.post('/mes/pro/andon-config/create', data); +} + +/** 修改安灯配置 */ +export function updateAndonConfig(data: MesProAndonConfigApi.AndonConfig) { + return requestClient.put('/mes/pro/andon-config/update', data); +} + +/** 删除安灯配置 */ +export function deleteAndonConfig(id: number) { + return requestClient.delete(`/mes/pro/andon-config/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/andon/record/index.ts b/apps/web-antd/src/api/mes/pro/andon/record/index.ts new file mode 100644 index 000000000..b8cf4349b --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/andon/record/index.ts @@ -0,0 +1,76 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProAndonRecordApi { + /** MES 安灯记录 */ + export interface AndonRecord { + id?: number; + configId?: number; // 安灯配置编号 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + processId?: number; // 工序编号 + processName?: string; // 工序名称 + userId?: number; // 发起用户编号 + userNickname?: string; // 发起人昵称 + reason?: string; // 呼叫原因 + level?: number; // 级别 + status?: number; // 处置状态 + handleTime?: number; // 处置时间(毫秒时间戳) + handlerUserId?: number; // 处置人编号 + handlerUserNickname?: string; // 处置人昵称 + remark?: string; // 备注 + createTime?: number; // 发起时间 + } + + /** MES 安灯记录分页查询参数 */ + export interface PageParams extends PageParam { + workstationId?: number; // 工作站编号 + userId?: number; // 发起用户编号 + handlerUserId?: number; // 处置人编号 + status?: number; // 处置状态 + createTime?: string[]; // 发起时间区间 + } +} + +/** 查询安灯记录分页 */ +export function getAndonRecordPage(params: MesProAndonRecordApi.PageParams) { + return requestClient.get>( + '/mes/pro/andon-record/page', + { params }, + ); +} + +/** 查询安灯记录详情 */ +export function getAndonRecord(id: number) { + return requestClient.get( + `/mes/pro/andon-record/get?id=${id}`, + ); +} + +/** 新增安灯记录 */ +export function createAndonRecord(data: MesProAndonRecordApi.AndonRecord) { + return requestClient.post('/mes/pro/andon-record/create', data); +} + +/** 删除安灯记录 */ +export function deleteAndonRecord(id: number) { + return requestClient.delete(`/mes/pro/andon-record/delete?id=${id}`); +} + +/** 更新安灯记录(保存/已处置) */ +export function updateAndonRecord(data: MesProAndonRecordApi.AndonRecord) { + return requestClient.put('/mes/pro/andon-record/update', data); +} + +/** 导出安灯记录 Excel */ +export function exportAndonRecord( + params: Partial, +) { + return requestClient.download('/mes/pro/andon-record/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/mes/pro/feedback/index.ts b/apps/web-antd/src/api/mes/pro/feedback/index.ts new file mode 100644 index 000000000..21a988ba8 --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/feedback/index.ts @@ -0,0 +1,113 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProFeedbackApi { + /** MES 生产报工 */ + export interface Feedback { + id?: number; + code?: string; // 报工单编号 + type?: number; // 报工类型 + channel?: string; // 报工途径 + feedbackTime?: number; // 报工时间 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + routeId?: number; // 工艺路线编号 + routeCode?: string; // 工艺路线编码 + processId?: number; // 工序编号 + processCode?: string; // 工序编码 + processName?: string; // 工序名称 + checkFlag?: boolean; // 是否需要检验 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + workOrderName?: string; // 工单名称 + taskId?: number; // 生产任务编号 + taskCode?: string; // 任务编码 + itemId?: number; // 产品物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + itemSpecification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位名称 + expireDate?: number; // 过期日期 + scheduledQuantity?: number; // 排产数量 + feedbackQuantity?: number; // 本次报工数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不良品数量 + uncheckQuantity?: number; // 待检测数量 + laborScrapQuantity?: number; // 工废数量 + materialScrapQuantity?: number; // 料废数量 + otherScrapQuantity?: number; // 其他废品数量 + feedbackUserId?: number; // 报工用户编号 + feedbackUserNickname?: string; // 报工人昵称 + approveUserId?: number; // 审核用户编号 + approveUserNickname?: string; // 审核人昵称 + status?: number; // 状态 + remark?: string; // 备注 + creator?: string; // 创建人 + createTime?: number; // 创建时间 + } + + /** MES 生产报工分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + type?: number; + workOrderId?: number; + itemId?: number; + feedbackUserId?: number; + creator?: string; + status?: number; + feedbackTime?: string[]; + } +} + +/** 查询生产报工分页 */ +export function getFeedbackPage(params: MesProFeedbackApi.PageParams) { + return requestClient.get>( + '/mes/pro/feedback/page', + { params }, + ); +} + +/** 查询生产报工详情 */ +export function getFeedback(id: number) { + return requestClient.get( + `/mes/pro/feedback/get?id=${id}`, + ); +} + +/** 新增生产报工 */ +export function createFeedback(data: MesProFeedbackApi.Feedback) { + return requestClient.post('/mes/pro/feedback/create', data); +} + +/** 修改生产报工 */ +export function updateFeedback(data: MesProFeedbackApi.Feedback) { + return requestClient.put('/mes/pro/feedback/update', data); +} + +/** 删除生产报工 */ +export function deleteFeedback(id: number) { + return requestClient.delete(`/mes/pro/feedback/delete?id=${id}`); +} + +/** 导出生产报工 Excel */ +export function exportFeedback(params: Partial) { + return requestClient.download('/mes/pro/feedback/export-excel', { params }); +} + +/** 提交生产报工 */ +export function submitFeedback(id: number) { + return requestClient.put(`/mes/pro/feedback/submit?id=${id}`); +} + +/** 驳回生产报工 */ +export function rejectFeedback(id: number) { + return requestClient.put(`/mes/pro/feedback/reject?id=${id}`); +} + +/** 审批生产报工(返回是否已审批完成) */ +export function approveFeedback(id: number) { + return requestClient.put(`/mes/pro/feedback/approve?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/process/content/index.ts b/apps/web-antd/src/api/mes/pro/process/content/index.ts new file mode 100644 index 000000000..8a4c15e59 --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/process/content/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProProcessContentApi { + /** MES 生产工序内容(操作步骤) */ + export interface ProcessContent { + id?: number; + processId?: number; + sort?: number; + content?: string; + device?: string; + material?: string; + docUrl?: string; + remark?: string; + createTime?: Date; + } +} + +/** 按工序编号查询工序内容列表 */ +export function getProcessContentListByProcessId(processId: number) { + return requestClient.get( + `/mes/pro/process-content/list-by-process?processId=${processId}`, + ); +} + +/** 查询工序内容详情 */ +export function getProcessContent(id: number) { + return requestClient.get( + `/mes/pro/process-content/get?id=${id}`, + ); +} + +/** 新增工序内容 */ +export function createProcessContent( + data: MesProProcessContentApi.ProcessContent, +) { + return requestClient.post('/mes/pro/process-content/create', data); +} + +/** 修改工序内容 */ +export function updateProcessContent( + data: MesProProcessContentApi.ProcessContent, +) { + return requestClient.put('/mes/pro/process-content/update', data); +} + +/** 删除工序内容 */ +export function deleteProcessContent(id: number) { + return requestClient.delete(`/mes/pro/process-content/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/process/index.ts b/apps/web-antd/src/api/mes/pro/process/index.ts index 5a3893b18..a4ff1ea64 100644 --- a/apps/web-antd/src/api/mes/pro/process/index.ts +++ b/apps/web-antd/src/api/mes/pro/process/index.ts @@ -5,7 +5,7 @@ import { requestClient } from '#/api/request'; export namespace MesProProcessApi { /** MES 生产工序 */ export interface Process { - id: number; + id?: number; code?: string; name?: string; attention?: string; @@ -36,3 +36,23 @@ export function getProcess(id: number) { `/mes/pro/process/get?id=${id}`, ); } + +/** 新增生产工序 */ +export function createProcess(data: MesProProcessApi.Process) { + return requestClient.post('/mes/pro/process/create', data); +} + +/** 修改生产工序 */ +export function updateProcess(data: MesProProcessApi.Process) { + return requestClient.put('/mes/pro/process/update', data); +} + +/** 删除生产工序 */ +export function deleteProcess(id: number) { + return requestClient.delete(`/mes/pro/process/delete?id=${id}`); +} + +/** 导出生产工序 Excel */ +export function exportProcess(params: any) { + return requestClient.download('/mes/pro/process/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/pro/route/index.ts b/apps/web-antd/src/api/mes/pro/route/index.ts new file mode 100644 index 000000000..56baff6b5 --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/route/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProRouteApi { + /** MES 工艺路线 */ + export interface Route { + id?: number; + code?: string; + name?: string; + description?: string; + status?: number; + remark?: string; + createTime?: Date; + } +} + +/** 查询工艺路线分页 */ +export function getRoutePage(params: PageParam) { + return requestClient.get>( + '/mes/pro/route/page', + { params }, + ); +} + +/** 查询工艺路线精简列表 */ +export function getRouteSimpleList() { + return requestClient.get( + '/mes/pro/route/simple-list', + ); +} + +/** 查询工艺路线详情 */ +export function getRoute(id: number) { + return requestClient.get( + `/mes/pro/route/get?id=${id}`, + ); +} + +/** 新增工艺路线 */ +export function createRoute(data: MesProRouteApi.Route) { + return requestClient.post('/mes/pro/route/create', data); +} + +/** 修改工艺路线 */ +export function updateRoute(data: MesProRouteApi.Route) { + return requestClient.put('/mes/pro/route/update', data); +} + +/** 修改工艺路线状态 */ +export function updateRouteStatus(id: number, status: number) { + return requestClient.put( + `/mes/pro/route/update-status?id=${id}&status=${status}`, + ); +} + +/** 删除工艺路线 */ +export function deleteRoute(id: number) { + return requestClient.delete(`/mes/pro/route/delete?id=${id}`); +} + +/** 导出工艺路线 Excel */ +export function exportRoute(params: any) { + return requestClient.download('/mes/pro/route/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/pro/route/process/index.ts b/apps/web-antd/src/api/mes/pro/route/process/index.ts new file mode 100644 index 000000000..fee0ce9c4 --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/route/process/index.ts @@ -0,0 +1,70 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProRouteProcessApi { + /** MES 工艺路线工序 */ + export interface RouteProcess { + id?: number; + routeId?: number; + processId?: number; + processCode?: string; + processName?: string; + sort?: number; + nextProcessId?: number; + nextProcessName?: string; + linkType?: number; + prepareTime?: number; + waitTime?: number; + colorCode?: string; + keyFlag?: boolean; + checkFlag?: boolean; + remark?: string; + createTime?: Date; + } +} + +/** 按工艺路线查询工序列表 */ +export function getRouteProcessListByRoute(routeId: number) { + return requestClient.get( + `/mes/pro/route-process/list-by-route?routeId=${routeId}`, + ); +} + +/** 按产品查询工序列表(自动查找关联的工艺路线) */ +export function getRouteProcessListByProduct(productId: number) { + return requestClient.get( + `/mes/pro/route-process/list-by-product?productId=${productId}`, + ); +} + +/** 查询工艺路线工序详情 */ +export function getRouteProcess(id: number) { + return requestClient.get( + `/mes/pro/route-process/get?id=${id}`, + ); +} + +/** 按工艺路线 + 工序精确查询工序配置 */ +export function getRouteProcessByRouteAndProcess( + routeId: number, + processId: number, +) { + return requestClient.get( + '/mes/pro/route-process/get-by-route-and-process', + { params: { processId, routeId } }, + ); +} + +/** 新增工艺路线工序 */ +export function createRouteProcess(data: MesProRouteProcessApi.RouteProcess) { + return requestClient.post('/mes/pro/route-process/create', data); +} + +/** 修改工艺路线工序 */ +export function updateRouteProcess(data: MesProRouteProcessApi.RouteProcess) { + return requestClient.put('/mes/pro/route-process/update', data); +} + +/** 删除工艺路线工序 */ +export function deleteRouteProcess(id: number) { + return requestClient.delete(`/mes/pro/route-process/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/route/product/index.ts b/apps/web-antd/src/api/mes/pro/route/product/index.ts new file mode 100644 index 000000000..2312f688c --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/route/product/index.ts @@ -0,0 +1,48 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProRouteProductApi { + /** MES 工艺路线产品 */ + export interface RouteProduct { + id?: number; + routeId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + specification?: string; + unitName?: string; + quantity?: number; + productionTime?: number; + timeUnitType?: string; + remark?: string; + createTime?: Date; + } +} + +/** 按工艺路线查询产品列表 */ +export function getRouteProductListByRoute(routeId: number) { + return requestClient.get( + `/mes/pro/route-product/list-by-route?routeId=${routeId}`, + ); +} + +/** 查询工艺路线产品详情 */ +export function getRouteProduct(id: number) { + return requestClient.get( + `/mes/pro/route-product/get?id=${id}`, + ); +} + +/** 新增工艺路线产品 */ +export function createRouteProduct(data: MesProRouteProductApi.RouteProduct) { + return requestClient.post('/mes/pro/route-product/create', data); +} + +/** 修改工艺路线产品 */ +export function updateRouteProduct(data: MesProRouteProductApi.RouteProduct) { + return requestClient.put('/mes/pro/route-product/update', data); +} + +/** 删除工艺路线产品 */ +export function deleteRouteProduct(id: number) { + return requestClient.delete(`/mes/pro/route-product/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/route/productbom/index.ts b/apps/web-antd/src/api/mes/pro/route/productbom/index.ts new file mode 100644 index 000000000..7cfcbcc85 --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/route/productbom/index.ts @@ -0,0 +1,57 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProRouteProductBomApi { + /** MES 工艺路线产品 BOM */ + export interface RouteProductBom { + id?: number; + routeId?: number; + processId?: number; + productId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + specification?: string; + unitName?: string; + quantity?: number; + remark?: string; + createTime?: Date; + } +} + +/** 查询工艺路线产品 BOM 列表 */ +export function getRouteProductBomList(params: { + processId?: number; + productId?: number; + routeId: number; +}) { + return requestClient.get( + '/mes/pro/route-product-bom/list', + { params }, + ); +} + +/** 查询工艺路线产品 BOM 详情 */ +export function getRouteProductBom(id: number) { + return requestClient.get( + `/mes/pro/route-product-bom/get?id=${id}`, + ); +} + +/** 新增工艺路线产品 BOM */ +export function createRouteProductBom( + data: MesProRouteProductBomApi.RouteProductBom, +) { + return requestClient.post('/mes/pro/route-product-bom/create', data); +} + +/** 修改工艺路线产品 BOM */ +export function updateRouteProductBom( + data: MesProRouteProductBomApi.RouteProductBom, +) { + return requestClient.put('/mes/pro/route-product-bom/update', data); +} + +/** 删除工艺路线产品 BOM */ +export function deleteRouteProductBom(id: number) { + return requestClient.delete(`/mes/pro/route-product-bom/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/task/index.ts b/apps/web-antd/src/api/mes/pro/task/index.ts new file mode 100644 index 000000000..d7bfd2f5e --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/task/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProTaskApi { + /** MES 生产任务 */ + export interface Task { + id?: number; + code?: string; // 任务编码 + name?: string; // 任务名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + workOrderName?: string; // 工单名称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + routeId?: number; // 工艺路线编号 + processId?: number; // 工序编号 + processName?: string; // 工序名称 + itemId?: number; // 产品物料编号 + itemCode?: string; // 产品编码 + itemName?: string; // 产品名称 + itemSpecification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 排产数量 + producedQuantity?: number; // 已生产数量 + qualifyQuantity?: number; // 合格品数量 + unqualifyQuantity?: number; // 不良品数量 + changedQuantity?: number; // 调整数量 + clientId?: number; // 客户编号 + clientName?: string; // 客户名称 + startTime?: number; // 开始生产时间 + endTime?: number; // 结束生产时间 + duration?: number; // 生产时长(工作日,1=8小时) + requestDate?: number; // 需求日期(从工单查) + finishDate?: number; // 完成日期 + cancelDate?: number; // 取消日期 + colorCode?: string; // 甘特图显示颜色 + status?: number; // 任务状态 + checkFlag?: boolean; // 是否质检(派生自工艺路线工序) + remark?: string; // 备注 + } + + /** MES 生产任务分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + name?: string; + workOrderId?: number; + workstationId?: number; + itemId?: number; + statuses?: number[]; + status?: number; + } +} + +/** 查询生产任务分页 */ +export function getTaskPage(params: MesProTaskApi.PageParams) { + return requestClient.get>( + '/mes/pro/task/page', + { params }, + ); +} + +/** 查询生产任务详情 */ +export function getTask(id: number) { + return requestClient.get(`/mes/pro/task/get?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/pro/workorder/index.ts b/apps/web-antd/src/api/mes/pro/workorder/index.ts new file mode 100644 index 000000000..fcc22b79e --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/workorder/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProWorkOrderApi { + /** MES 生产工单 */ + export interface WorkOrder { + id?: number; + code?: string; // 工单编码 + name?: string; // 工单名称 + type?: number; // 工单类型 + status?: number; // 工单状态 + sourceType?: number; + productId?: number; // 产品物料编号 + productCode?: string; + productName?: string; + productSpecification?: string; + quantity?: number; + unitName?: string; + routeId?: number; + routeName?: string; + clientId?: number; + clientName?: string; + planStartTime?: number | string; + planEndTime?: number | string; + actualStartTime?: number | string; + actualEndTime?: number | string; + remark?: string; + createTime?: number | string; + } + + export interface PageParams extends PageParam { + code?: string; + name?: string; + status?: number; + type?: number; + } +} + +/** 查询生产工单分页 */ +export function getWorkOrderPage(params: MesProWorkOrderApi.PageParams) { + return requestClient.get>( + '/mes/pro/work-order/page', + { params }, + ); +} + +/** 查询生产工单详情 */ +export function getWorkOrder(id: number) { + return requestClient.get( + `/mes/pro/work-order/get?id=${id}`, + ); +} diff --git a/apps/web-antd/src/api/mes/pro/workrecord/index.ts b/apps/web-antd/src/api/mes/pro/workrecord/index.ts new file mode 100644 index 000000000..08950365c --- /dev/null +++ b/apps/web-antd/src/api/mes/pro/workrecord/index.ts @@ -0,0 +1,71 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProWorkRecordApi { + /** MES 工作记录流水 */ + export interface WorkRecordLog { + id?: number; // 编号 + userId?: number; // 用户编号 + userNickname?: string; // 用户昵称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + type?: number; // 1=上工 2=下工 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** MES 当前用户工作站绑定状态 */ + export interface MyWorkRecord { + userId?: number; // 用户编号 + userNickname?: string; // 用户昵称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + type?: number; // 1=上工 2=下工 + clockInTime?: Date; // 上工时间 + clockOutTime?: Date; // 下工时间 + } +} + +/** 查询工作记录分页 */ +export function getWorkRecordLogPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/workrecord/log/page', + { params }, + ); +} + +/** 查询工作记录详情 */ +export function getWorkRecordLog(id: number) { + return requestClient.get( + `/mes/pro/workrecord/log/get?id=${id}`, + ); +} + +/** 导出工作记录 */ +export function exportWorkRecordLog(params: any) { + return requestClient.download('/mes/pro/workrecord/log/export-excel', { + params, + }); +} + +/** 上工(绑定工作站) */ +export function clockInWorkRecord(workstationId: number) { + return requestClient.put('/mes/pro/workrecord/clock-in', null, { + params: { workstationId }, + }); +} + +/** 下工(解绑工作站) */ +export function clockOutWorkRecord() { + return requestClient.put('/mes/pro/workrecord/clock-out'); +} + +/** 查询当前用户绑定的工作站 */ +export function getMyWorkRecord() { + return requestClient.get( + '/mes/pro/workrecord/get-my', + ); +} diff --git a/apps/web-antd/src/api/mes/qc/defect/index.ts b/apps/web-antd/src/api/mes/qc/defect/index.ts new file mode 100644 index 000000000..0b46d3581 --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/defect/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcDefectApi { + /** MES 缺陷类型 */ + export interface Defect { + id?: number; // 编号 + code?: string; // 缺陷编码 + name?: string; // 缺陷描述 + type?: number; // 检测项类型 + level?: number; // 缺陷等级 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询缺陷类型分页 */ +export function getDefectPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/defect/page', + { params }, + ); +} + +/** 查询缺陷类型精简列表 */ +export function getDefectSimpleList() { + return requestClient.get('/mes/qc/defect/simple-list'); +} + +/** 查询缺陷类型详情 */ +export function getDefect(id: number) { + return requestClient.get(`/mes/qc/defect/get?id=${id}`); +} + +/** 新增缺陷类型 */ +export function createDefect(data: MesQcDefectApi.Defect) { + return requestClient.post('/mes/qc/defect/create', data); +} + +/** 修改缺陷类型 */ +export function updateDefect(data: MesQcDefectApi.Defect) { + return requestClient.put('/mes/qc/defect/update', data); +} + +/** 删除缺陷类型 */ +export function deleteDefect(id: number) { + return requestClient.delete(`/mes/qc/defect/delete?id=${id}`); +} + +/** 导出缺陷类型 */ +export function exportDefect(params: any) { + return requestClient.download('/mes/qc/defect/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/qc/indicator/index.ts b/apps/web-antd/src/api/mes/qc/indicator/index.ts new file mode 100644 index 000000000..163f11d89 --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/indicator/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIndicatorApi { + /** MES 质检指标 */ + export interface Indicator { + id?: number; // 编号 + code?: string; // 检测项编码 + name?: string; // 检测项名称 + type?: number; // 检测项类型 + tool?: string; // 检测工具 + resultType?: number; // 结果值类型 + resultSpecification?: string; // 结果值属性 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询质检指标分页 */ +export function getIndicatorPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/indicator/page', + { params }, + ); +} + +/** 查询质检指标详情 */ +export function getIndicator(id: number) { + return requestClient.get( + `/mes/qc/indicator/get?id=${id}`, + ); +} + +/** 新增质检指标 */ +export function createIndicator(data: MesQcIndicatorApi.Indicator) { + return requestClient.post('/mes/qc/indicator/create', data); +} + +/** 修改质检指标 */ +export function updateIndicator(data: MesQcIndicatorApi.Indicator) { + return requestClient.put('/mes/qc/indicator/update', data); +} + +/** 删除质检指标 */ +export function deleteIndicator(id: number) { + return requestClient.delete(`/mes/qc/indicator/delete?id=${id}`); +} + +/** 导出质检指标 */ +export function exportIndicator(params: any) { + return requestClient.download('/mes/qc/indicator/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/qc/template/index.ts b/apps/web-antd/src/api/mes/qc/template/index.ts new file mode 100644 index 000000000..768864482 --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/template/index.ts @@ -0,0 +1,51 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateApi { + /** MES 质检方案 */ + export interface Template { + id?: number; // 编号 + code?: string; // 方案编号 + name?: string; // 方案名称 + types?: number[]; // 检测种类 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询质检方案分页 */ +export function getTemplatePage(params: PageParam) { + return requestClient.get>( + '/mes/qc/template/page', + { params }, + ); +} + +/** 查询质检方案详情 */ +export function getTemplate(id: number) { + return requestClient.get( + `/mes/qc/template/get?id=${id}`, + ); +} + +/** 新增质检方案 */ +export function createTemplate(data: MesQcTemplateApi.Template) { + return requestClient.post('/mes/qc/template/create', data); +} + +/** 修改质检方案 */ +export function updateTemplate(data: MesQcTemplateApi.Template) { + return requestClient.put('/mes/qc/template/update', data); +} + +/** 删除质检方案 */ +export function deleteTemplate(id: number) { + return requestClient.delete(`/mes/qc/template/delete?id=${id}`); +} + +/** 导出质检方案 */ +export function exportTemplate(params: any) { + return requestClient.download('/mes/qc/template/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/mes/qc/template/indicator/index.ts b/apps/web-antd/src/api/mes/qc/template/indicator/index.ts new file mode 100644 index 000000000..8fa8119e6 --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/template/indicator/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateIndicatorApi { + /** MES 质检方案-检测指标项 */ + export interface TemplateIndicator { + id?: number; // 编号 + templateId?: number; // 质检方案ID + indicatorId?: number; // 质检指标ID + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位ID + thresholdMax?: number; // 误差上限 + thresholdMin?: number; // 误差下限 + docUrl?: string; // 说明图URL + remark?: string; // 备注 + indicatorCode?: string; // 检测项编码(JOIN) + indicatorName?: string; // 检测项名称(JOIN) + indicatorType?: number; // 检测项类型(JOIN) + indicatorTool?: string; // 检测工具(JOIN) + unitMeasureName?: string; // 计量单位名称(JOIN) + } +} + +/** 查询检测指标项分页 */ +export function getTemplateIndicatorPage(params: PageParam & { templateId?: number }) { + return requestClient.get< + PageResult + >('/mes/qc/template/indicator/page', { params }); +} + +/** 查询检测指标项详情 */ +export function getTemplateIndicator(id: number) { + return requestClient.get( + `/mes/qc/template/indicator/get?id=${id}`, + ); +} + +/** 新增检测指标项 */ +export function createTemplateIndicator( + data: MesQcTemplateIndicatorApi.TemplateIndicator, +) { + return requestClient.post('/mes/qc/template/indicator/create', data); +} + +/** 修改检测指标项 */ +export function updateTemplateIndicator( + data: MesQcTemplateIndicatorApi.TemplateIndicator, +) { + return requestClient.put('/mes/qc/template/indicator/update', data); +} + +/** 删除检测指标项 */ +export function deleteTemplateIndicator(id: number) { + return requestClient.delete(`/mes/qc/template/indicator/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/qc/template/item/index.ts b/apps/web-antd/src/api/mes/qc/template/item/index.ts new file mode 100644 index 000000000..b1d5b1e6b --- /dev/null +++ b/apps/web-antd/src/api/mes/qc/template/item/index.ts @@ -0,0 +1,52 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateItemApi { + /** MES 质检方案-产品关联 */ + export interface TemplateItem { + id?: number; // 编号 + templateId?: number; // 质检方案ID + itemId?: number; // 产品物料ID + quantityCheck?: number; // 最低检测数 + quantityUnqualified?: number; // 最大不合格数 + criticalRate?: number; // 最大致命缺陷率(%) + majorRate?: number; // 最大严重缺陷率(%) + minorRate?: number; // 最大轻微缺陷率(%) + remark?: string; // 备注 + itemCode?: string; // 物料编码(JOIN) + itemName?: string; // 物料名称(JOIN) + specification?: string; // 规格型号(JOIN) + unitMeasureName?: string; // 计量单位名称(JOIN) + } +} + +/** 查询产品关联分页 */ +export function getTemplateItemPage(params: PageParam & { templateId?: number }) { + return requestClient.get>( + '/mes/qc/template/item/page', + { params }, + ); +} + +/** 查询产品关联详情 */ +export function getTemplateItem(id: number) { + return requestClient.get( + `/mes/qc/template/item/get?id=${id}`, + ); +} + +/** 新增产品关联 */ +export function createTemplateItem(data: MesQcTemplateItemApi.TemplateItem) { + return requestClient.post('/mes/qc/template/item/create', data); +} + +/** 修改产品关联 */ +export function updateTemplateItem(data: MesQcTemplateItemApi.TemplateItem) { + return requestClient.put('/mes/qc/template/item/update', data); +} + +/** 删除产品关联 */ +export function deleteTemplateItem(id: number) { + return requestClient.delete(`/mes/qc/template/item/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/wm/barcode/config/index.ts b/apps/web-antd/src/api/mes/wm/barcode/config/index.ts new file mode 100644 index 000000000..862da4fbb --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/barcode/config/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmBarcodeConfigApi { + /** MES 条码配置 */ + export interface BarcodeConfig { + id?: number; // 编号 + format?: number; // 条码格式 + bizType?: number; // 业务类型 + contentFormat?: string; // 内容格式模板 + contentExample?: string; // 内容样例 + autoGenerateFlag?: boolean; // 是否自动生成 + defaultTemplate?: string; // 默认打印模板 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询条码配置分页 */ +export function getBarcodeConfigPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/barcode-config/page', + { params }, + ); +} + +/** 查询条码配置详情 */ +export function getBarcodeConfig(id: number) { + return requestClient.get( + `/mes/wm/barcode-config/get?id=${id}`, + ); +} + +/** 新增条码配置 */ +export function createBarcodeConfig(data: MesWmBarcodeConfigApi.BarcodeConfig) { + return requestClient.post('/mes/wm/barcode-config/create', data); +} + +/** 修改条码配置 */ +export function updateBarcodeConfig(data: MesWmBarcodeConfigApi.BarcodeConfig) { + return requestClient.put('/mes/wm/barcode-config/update', data); +} + +/** 删除条码配置 */ +export function deleteBarcodeConfig(id: number) { + return requestClient.delete(`/mes/wm/barcode-config/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/wm/barcode/index.ts b/apps/web-antd/src/api/mes/wm/barcode/index.ts index 6cbf8a51e..7e8154141 100644 --- a/apps/web-antd/src/api/mes/wm/barcode/index.ts +++ b/apps/web-antd/src/api/mes/wm/barcode/index.ts @@ -38,7 +38,7 @@ export function getBarcode(id: number) { export function getBarcodeByBusiness(bizType: number, bizId: number) { return requestClient.get( '/mes/wm/barcode/get-by-business', - { params: { bizType, bizId } }, + { params: { bizId, bizType } }, ); } @@ -57,9 +57,14 @@ export function deleteBarcode(id: number) { return requestClient.delete(`/mes/wm/barcode/delete?id=${id}`); } +/** 导出条码 */ +export function exportBarcode(params: any) { + return requestClient.download('/mes/wm/barcode/export-excel', { params }); +} + /** 生成条码内容 */ export function generateBarcodeContent(bizType: number, bizCode: string) { return requestClient.get('/mes/wm/barcode/generate-content', { - params: { bizType, bizCode }, + params: { bizCode, bizType }, }); } diff --git a/apps/web-antd/src/api/mes/wm/itemconsume/line/index.ts b/apps/web-antd/src/api/mes/wm/itemconsume/line/index.ts new file mode 100644 index 000000000..2a353b766 --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/itemconsume/line/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmItemConsumeLineApi { + /** MES 物料消耗行 */ + export interface ItemConsumeLine { + id?: number; + feedbackId?: number; // 报工编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物资编码 + itemName?: string; // 物资名称 + specification?: string; // 规格型号 + unitId?: number; // 单位编号 + unitName?: string; // 单位 + quantity?: number; // 消耗数量 + batchCode?: string; // 批次号 + locationId?: number; // 库位编号 + locationName?: string; // 库位名称 + remark?: string; // 备注 + } + + /** MES 物料消耗行分页查询参数 */ + export interface PageParams extends PageParam { + feedbackId?: number; + } +} + +/** 查询物料消耗行分页 */ +export function getItemConsumeLinePage( + params: MesWmItemConsumeLineApi.PageParams, +) { + return requestClient.get>( + '/mes/wm/item-consume-line/page', + { params }, + ); +} diff --git a/apps/web-antd/src/api/mes/wm/materialstock/index.ts b/apps/web-antd/src/api/mes/wm/materialstock/index.ts new file mode 100644 index 000000000..49aab9620 --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/materialstock/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmMaterialStockApi { + /** MES 库存台账 */ + export interface MaterialStock { + id?: number; // 编号 + itemTypeId?: number; // 物料分类编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseCode?: string; // 仓库编码 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + vendorId?: number; // 供应商编号 + vendorName?: string; // 供应商名称 + quantity?: number; // 在库数量 + receiptTime?: string; // 入库日期 + frozen?: boolean; // 是否冻结 + createTime?: Date; // 创建时间 + } +} + +/** 查询库存台账分页 */ +export function getMaterialStockPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/material-stock/page', + { params }, + ); +} + +/** 查询库存台账详情 */ +export function getMaterialStock(id: number) { + return requestClient.get( + `/mes/wm/material-stock/get?id=${id}`, + ); +} + +/** 更新库存冻结状态 */ +export function updateMaterialStockFrozen(data: { + frozen: boolean; + id: number; +}) { + return requestClient.put('/mes/wm/material-stock/update-frozen', data); +} + +/** 导出库存台账 */ +export function exportMaterialStock(params: any) { + return requestClient.download('/mes/wm/material-stock/export-excel', { + params, + }); +} diff --git a/apps/web-antd/src/api/mes/wm/productproduce/line/index.ts b/apps/web-antd/src/api/mes/wm/productproduce/line/index.ts new file mode 100644 index 000000000..ab3f49f29 --- /dev/null +++ b/apps/web-antd/src/api/mes/wm/productproduce/line/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductProduceLineApi { + /** MES 产品产出行 */ + export interface ProductProduceLine { + id?: number; + feedbackId?: number; // 报工编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物资编码 + itemName?: string; // 物资名称 + specification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位 + quantity?: number; // 产出数量 + batchCode?: string; // 批次号 + qualityStatus?: number; // 质量状态 + locationId?: number; // 库位编号 + locationName?: string; // 库位名称 + remark?: string; // 备注 + } + + /** MES 产品产出行分页查询参数 */ + export interface PageParams extends PageParam { + feedbackId?: number; + } +} + +/** 查询产品产出行分页 */ +export function getProductProduceLinePage( + params: MesWmProductProduceLineApi.PageParams, +) { + return requestClient.get< + PageResult + >('/mes/wm/product-produce-line/page', { params }); +} diff --git a/apps/web-antd/src/api/mes/wm/warehouse/area/index.ts b/apps/web-antd/src/api/mes/wm/warehouse/area/index.ts index cf5844ade..ca67789d8 100644 --- a/apps/web-antd/src/api/mes/wm/warehouse/area/index.ts +++ b/apps/web-antd/src/api/mes/wm/warehouse/area/index.ts @@ -48,3 +48,18 @@ export function getWarehouseArea(id: number) { `/mes/wm/warehouse-area/get?id=${id}`, ); } + +/** 新增库位 */ +export function createWarehouseArea(data: MesWmWarehouseAreaApi.WarehouseArea) { + return requestClient.post('/mes/wm/warehouse-area/create', data); +} + +/** 修改库位 */ +export function updateWarehouseArea(data: MesWmWarehouseAreaApi.WarehouseArea) { + return requestClient.put('/mes/wm/warehouse-area/update', data); +} + +/** 删除库位 */ +export function deleteWarehouseArea(id: number) { + return requestClient.delete(`/mes/wm/warehouse-area/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/wm/warehouse/index.ts b/apps/web-antd/src/api/mes/wm/warehouse/index.ts index f68604790..661b62ee4 100644 --- a/apps/web-antd/src/api/mes/wm/warehouse/index.ts +++ b/apps/web-antd/src/api/mes/wm/warehouse/index.ts @@ -38,3 +38,18 @@ export function getWarehouse(id: number) { `/mes/wm/warehouse/get?id=${id}`, ); } + +/** 新增仓库 */ +export function createWarehouse(data: MesWmWarehouseApi.Warehouse) { + return requestClient.post('/mes/wm/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: MesWmWarehouseApi.Warehouse) { + return requestClient.put('/mes/wm/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/mes/wm/warehouse/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/mes/wm/warehouse/location/index.ts b/apps/web-antd/src/api/mes/wm/warehouse/location/index.ts index e33fb180e..4211f73c8 100644 --- a/apps/web-antd/src/api/mes/wm/warehouse/location/index.ts +++ b/apps/web-antd/src/api/mes/wm/warehouse/location/index.ts @@ -38,3 +38,35 @@ export function getWarehouseLocation(id: number) { `/mes/wm/warehouse-location/get?id=${id}`, ); } + +/** 新增库区 */ +export function createWarehouseLocation( + data: MesWmWarehouseLocationApi.WarehouseLocation, +) { + return requestClient.post('/mes/wm/warehouse-location/create', data); +} + +/** 修改库区 */ +export function updateWarehouseLocation( + data: MesWmWarehouseLocationApi.WarehouseLocation, +) { + return requestClient.put('/mes/wm/warehouse-location/update', data); +} + +/** 删除库区 */ +export function deleteWarehouseLocation(id: number) { + return requestClient.delete(`/mes/wm/warehouse-location/delete?id=${id}`); +} + +/** 批量设置库区下所有库位的混放规则 */ +export function updateAreaByLocationId( + locationId: number, + allowItemMixing?: boolean, + allowBatchMixing?: boolean, +) { + return requestClient.put( + '/mes/wm/warehouse-location/update-by-location-id', + null, + { params: { allowBatchMixing, allowItemMixing, locationId } }, + ); +} diff --git a/apps/web-antd/src/assets/imgs/iot/device.png b/apps/web-antd/src/assets/imgs/iot/device.png new file mode 100644 index 000000000..79339cdf4 Binary files /dev/null and b/apps/web-antd/src/assets/imgs/iot/device.png differ diff --git a/apps/web-antd/src/assets/svgs/iot/cube.svg b/apps/web-antd/src/assets/svgs/iot/cube.svg new file mode 100644 index 000000000..200ac1b1c --- /dev/null +++ b/apps/web-antd/src/assets/svgs/iot/cube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web-antd/src/components/shortcut-date-range-picker/shortcut-date-range-picker.vue b/apps/web-antd/src/components/shortcut-date-range-picker/shortcut-date-range-picker.vue index 5a3ce0526..3dc3f15eb 100644 --- a/apps/web-antd/src/components/shortcut-date-range-picker/shortcut-date-range-picker.vue +++ b/apps/web-antd/src/components/shortcut-date-range-picker/shortcut-date-range-picker.vue @@ -4,6 +4,7 @@ import type { Dayjs } from 'dayjs'; import { onMounted, ref } from 'vue'; import { DatePicker, Radio, RadioGroup } from 'ant-design-vue'; +import dayjs from 'dayjs'; import { getRangePickerDefaultProps } from '#/utils/rangePickerProps'; @@ -19,8 +20,20 @@ const times = ref<[Dayjs, Dayjs]>(); // 日期范围 const rangePickerProps = getRangePickerDefaultProps(); const timeRangeOptions = [ rangePickerProps.presets[3]!, // 昨天 - rangePickerProps.presets[1]!, // 最近 7 天 - rangePickerProps.presets[2]!, // 最近 30 天 + { + label: rangePickerProps.presets[1]!.label, + value: [ + dayjs().subtract(7, 'day').startOf('day'), + dayjs().subtract(1, 'day').endOf('day'), + ], + }, + { + label: rangePickerProps.presets[2]!.label, + value: [ + dayjs().subtract(30, 'day').startOf('day'), + dayjs().subtract(1, 'day').endOf('day'), + ], + }, ]; const timeRangeType = ref(timeRangeOptions[1]!.label); // 默认选中第一个选项 diff --git a/apps/web-antd/src/components/upload/file-upload.vue b/apps/web-antd/src/components/upload/file-upload.vue index 3838642ea..85afc3b9d 100644 --- a/apps/web-antd/src/components/upload/file-upload.vue +++ b/apps/web-antd/src/components/upload/file-upload.vue @@ -32,6 +32,7 @@ const props = withDefaults(defineProps(), { multiple: false, api: undefined, resultField: '', + returnText: false, showDescription: false, }); const emit = defineEmits([ @@ -147,9 +148,6 @@ function handleUploadError(error: any) { * @returns 是否允许上传 */ async function beforeUpload(file: File) { - const fileContent = await file.text(); - emit('returnText', fileContent); - // 检查文件数量限制 if (fileList.value!.length >= props.maxNumber) { message.error($t('ui.upload.maxNumber', [props.maxNumber])); @@ -176,6 +174,10 @@ async function beforeUpload(file: File) { // 只有在验证通过后才增加计数器 uploadNumber.value++; + if (props.returnText) { + const fileContent = await file.text(); + emit('returnText', fileContent); + } return true; } diff --git a/apps/web-antd/src/components/upload/input-upload.vue b/apps/web-antd/src/components/upload/input-upload.vue index 90b2f4f7c..88f00f1cf 100644 --- a/apps/web-antd/src/components/upload/input-upload.vue +++ b/apps/web-antd/src/components/upload/input-upload.vue @@ -58,6 +58,7 @@ const textareaProps = computed(() => { const fileUploadProps = computed(() => { return { ...props.fileUploadProps, + returnText: true, }; }); diff --git a/apps/web-antd/src/components/upload/typing.ts b/apps/web-antd/src/components/upload/typing.ts index f3c16bc4d..990aa7d8a 100644 --- a/apps/web-antd/src/components/upload/typing.ts +++ b/apps/web-antd/src/components/upload/typing.ts @@ -27,6 +27,7 @@ export interface FileUploadProps { maxSize?: number; // 文件最大多少MB multiple?: boolean; // 是否支持多选 resultField?: string; // support xxx.xxx.xx + returnText?: boolean; // 是否返回文件文本内容 showDescription?: boolean; // 是否显示下面的描述 value?: string | string[]; } diff --git a/apps/web-antd/src/router/routes/modules/iot.ts b/apps/web-antd/src/router/routes/modules/iot.ts index 04cf97d35..a1d2203b9 100644 --- a/apps/web-antd/src/router/routes/modules/iot.ts +++ b/apps/web-antd/src/router/routes/modules/iot.ts @@ -12,7 +12,7 @@ const routes: RouteRecordRaw[] = [ }, children: [ { - path: 'product/detail/:id', + path: 'product/product/detail/:id', name: 'IoTProductDetail', meta: { title: '产品详情', @@ -30,11 +30,11 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/iot/device/device/detail/index.vue'), }, { - path: 'ota/firmware/detail/:id', + path: 'ota/operation/firmware/detail/:id', name: 'IoTOtaFirmwareDetail', meta: { title: '固件详情', - activePath: '/iot/ota', + activePath: '/iot/operation/ota/firmware', }, component: () => import('#/views/iot/ota/firmware/detail/index.vue'), }, diff --git a/apps/web-antd/src/views/ai/image/manager/index.vue b/apps/web-antd/src/views/ai/image/manager/index.vue index 62087c743..04d048e80 100644 --- a/apps/web-antd/src/views/ai/image/manager/index.vue +++ b/apps/web-antd/src/views/ai/image/manager/index.vue @@ -38,24 +38,21 @@ async function handleUpdatePublicStatusChange( row: AiImageApi.Image, ): Promise { const text = newStatus ? '公开' : '私有'; - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确认要将该图片切换为【${text}】吗?`, - }) - .then(async () => { - // 更新图片状态 - await updateImage({ - id: row.id, - publicStatus: newStatus, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新图片状态 + await updateImage({ + id: row.id, + publicStatus: newStatus, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antd/src/views/ai/knowledge/document/index.vue b/apps/web-antd/src/views/ai/knowledge/document/index.vue index e1dd551fa..5d21febd3 100644 --- a/apps/web-antd/src/views/ai/knowledge/document/index.vue +++ b/apps/web-antd/src/views/ai/knowledge/document/index.vue @@ -76,24 +76,21 @@ async function handleStatusChange( newStatus: number, row: AiKnowledgeDocumentApi.KnowledgeDocument, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${row.name}的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新文档状态 - await updateKnowledgeDocumentStatus({ - id: row.id, - status: newStatus, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新文档状态 + await updateKnowledgeDocumentStatus({ + id: row.id, + status: newStatus, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antd/src/views/ai/knowledge/segment/index.vue b/apps/web-antd/src/views/ai/knowledge/segment/index.vue index 363e6b1ad..2f9955e64 100644 --- a/apps/web-antd/src/views/ai/knowledge/segment/index.vue +++ b/apps/web-antd/src/views/ai/knowledge/segment/index.vue @@ -64,21 +64,18 @@ async function handleStatusChange( newStatus: number, row: AiKnowledgeSegmentApi.KnowledgeSegment, ): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将片段 ${row.id} 的状态切换为【${getDictLabel(DICT_TYPE.COMMON_STATUS, newStatus)}】吗?`, - }) - .then(async () => { - // 更新片段状态 - await updateKnowledgeSegmentStatus(row.id!, newStatus); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新片段状态 + await updateKnowledgeSegmentStatus(row.id!, newStatus); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antd/src/views/ai/music/manager/index.vue b/apps/web-antd/src/views/ai/music/manager/index.vue index bfd4d4502..6d03547cd 100644 --- a/apps/web-antd/src/views/ai/music/manager/index.vue +++ b/apps/web-antd/src/views/ai/music/manager/index.vue @@ -38,24 +38,21 @@ async function handleUpdatePublicStatusChange( row: AiMusicApi.Music, ): Promise { const text = newStatus ? '公开' : '私有'; - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确认要将该音乐切换为【${text}】吗?`, - }) - .then(async () => { - // 更新音乐状态 - await updateMusic({ - id: row.id, - publicStatus: newStatus, - }); - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + // 更新音乐状态 + await updateMusic({ + id: row.id, + publicStatus: newStatus, }); + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antd/src/views/crm/business/components/detail-list.vue b/apps/web-antd/src/views/crm/business/components/detail-list.vue index 712b55e82..87f36d459 100644 --- a/apps/web-antd/src/views/crm/business/components/detail-list.vue +++ b/apps/web-antd/src/views/crm/business/components/detail-list.vue @@ -74,28 +74,24 @@ async function handleDeleteContactBusinessList() { message.error('请先选择商机后操作!'); return; } - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确定要将${checkedRows.value.map((item) => item.name).join(',')}解除关联吗?`, - }) - .then(async () => { - const res = await deleteContactBusinessList({ - contactId: props.bizId, - businessIds: checkedRows.value.map((item) => item.id), - }); - if (res) { - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - } else { - reject(new Error($t('ui.actionMessage.operationFailed'))); - } - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + const res = await deleteContactBusinessList({ + contactId: props.bizId, + businessIds: checkedRows.value.map((item) => item.id), }); + if (!res) { + throw new Error($t('ui.actionMessage.operationFailed')); + } + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } /** 查看商机详情 */ diff --git a/apps/web-antd/src/views/crm/clue/detail/index.vue b/apps/web-antd/src/views/crm/clue/detail/index.vue index 02c356400..98117c0e4 100644 --- a/apps/web-antd/src/views/crm/clue/detail/index.vue +++ b/apps/web-antd/src/views/crm/clue/detail/index.vue @@ -83,21 +83,18 @@ function handleTransfer() { /** 转化为客户 */ async function handleTransform(): Promise { - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: '确定将该线索转化为客户吗?', - }) - .then(async () => { - // 转化为客户 - await transformClue(clueId.value); - // 提示并返回成功 - message.success('转化客户成功'); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 转化为客户 + await transformClue(clueId.value); + // 提示并返回成功 + message.success('转化客户成功'); + return true; } /** 加载数据 */ diff --git a/apps/web-antd/src/views/crm/contact/components/detail-list.vue b/apps/web-antd/src/views/crm/contact/components/detail-list.vue index 832f80473..7e408cf3a 100644 --- a/apps/web-antd/src/views/crm/contact/components/detail-list.vue +++ b/apps/web-antd/src/views/crm/contact/components/detail-list.vue @@ -71,28 +71,24 @@ async function handleDeleteContactBusinessList() { message.error('请先选择联系人后操作!'); return; } - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `确定要将${checkedRows.value.map((item) => item.name).join(',')}解除关联吗?`, - }) - .then(async () => { - const res = await deleteBusinessContactList({ - businessId: props.bizId, - contactIds: checkedRows.value.map((item) => item.id), - }); - if (res) { - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - } else { - reject(new Error($t('ui.actionMessage.operationFailed'))); - } - }) - .catch(() => { - reject(new Error('取消操作')); - }); + }); + } catch { + return false; + } + const res = await deleteBusinessContactList({ + businessId: props.bizId, + contactIds: checkedRows.value.map((item) => item.id), }); + if (!res) { + throw new Error($t('ui.actionMessage.operationFailed')); + } + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } /** 创建商机联系人关联 */ diff --git a/apps/web-antd/src/views/crm/customer/detail/index.vue b/apps/web-antd/src/views/crm/customer/detail/index.vue index 925d1a5ac..8faf13e93 100644 --- a/apps/web-antd/src/views/crm/customer/detail/index.vue +++ b/apps/web-antd/src/views/crm/customer/detail/index.vue @@ -100,41 +100,35 @@ function handleTransfer() { } /** 锁定客户 */ -function handleLock(lockStatus: boolean): Promise { - return new Promise((resolve, reject) => { - confirm({ +async function handleLock(lockStatus: boolean): Promise { + try { + await confirm({ content: `确定锁定客户【${customer.value.name}】吗?`, - }) - .then(async () => { - // 锁定客户 - await lockCustomer(customerId.value, lockStatus); - // 提示并返回成功 - message.success(lockStatus ? '锁定客户成功' : '解锁客户成功'); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 锁定客户 + await lockCustomer(customerId.value, lockStatus); + // 提示并返回成功 + message.success(lockStatus ? '锁定客户成功' : '解锁客户成功'); + return true; } /** 领取客户 */ -function handleReceive(): Promise { - return new Promise((resolve, reject) => { - confirm({ +async function handleReceive(): Promise { + try { + await confirm({ content: `确定领取客户【${customer.value.name}】吗?`, - }) - .then(async () => { - // 领取客户 - await receiveCustomer([customerId.value]); - // 提示并返回成功 - message.success('领取客户成功'); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 领取客户 + await receiveCustomer([customerId.value]); + // 提示并返回成功 + message.success('领取客户成功'); + return true; } /** 分配客户 */ @@ -143,42 +137,36 @@ function handleDistributeForm() { } /** 客户放入公海 */ -function handlePutPool(): Promise { - return new Promise((resolve, reject) => { - confirm({ +async function handlePutPool(): Promise { + try { + await confirm({ content: `确定将客户【${customer.value.name}】放入公海吗?`, - }) - .then(async () => { - // 放入公海 - await putCustomerPool(customerId.value); - // 提示并返回成功 - message.success('放入公海成功'); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 放入公海 + await putCustomerPool(customerId.value); + // 提示并返回成功 + message.success('放入公海成功'); + return true; } /** 更新成交状态操作 */ async function handleUpdateDealStatus(): Promise { - return new Promise((resolve, reject) => { - const dealStatus = !customer.value.dealStatus; - confirm({ + const dealStatus = !customer.value.dealStatus; + try { + await confirm({ content: `确定更新成交状态为【${dealStatus ? '已成交' : '未成交'}】吗?`, - }) - .then(async () => { - // 更新成交状态 - await updateCustomerDealStatus(customerId.value, dealStatus); - // 提示并返回成功 - message.success('更新成交状态成功'); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新成交状态 + await updateCustomerDealStatus(customerId.value, dealStatus); + // 提示并返回成功 + message.success('更新成交状态成功'); + return true; } /** 加载数据 */ diff --git a/apps/web-antd/src/views/crm/permission/modules/list.vue b/apps/web-antd/src/views/crm/permission/modules/list.vue index 13f0fb723..2a2789ff9 100644 --- a/apps/web-antd/src/views/crm/permission/modules/list.vue +++ b/apps/web-antd/src/views/crm/permission/modules/list.vue @@ -94,32 +94,28 @@ function handleEdit() { } /** 删除团队成员 */ -function handleDelete() { +async function handleDelete() { if (checkedRows.value.length === 0) { message.error('请先选择团队成员后操作!'); return; } - return new Promise((resolve, reject) => { - confirm({ + try { + await confirm({ content: `你要将${checkedRows.value.map((item) => item.nickname).join(',')}移出团队吗?`, - }) - .then(async () => { - const res = await deletePermissionBatch( - checkedRows.value.map((item) => item.id!), - ); - if (res) { - // 提示并返回成功 - message.success($t('ui.actionMessage.operationSuccess')); - handleRefresh(); - resolve(true); - } else { - reject(new Error('移出失败')); - } - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + const res = await deletePermissionBatch( + checkedRows.value.map((item) => item.id!), + ); + if (!res) { + throw new Error('移出失败'); + } + // 提示并返回成功 + message.success($t('ui.actionMessage.operationSuccess')); + handleRefresh(); + return true; } /** 退出团队 */ diff --git a/apps/web-antd/src/views/erp/finance/account/index.vue b/apps/web-antd/src/views/erp/finance/account/index.vue index 4ceb7abba..2a91dbe9a 100644 --- a/apps/web-antd/src/views/erp/finance/account/index.vue +++ b/apps/web-antd/src/views/erp/finance/account/index.vue @@ -65,23 +65,20 @@ async function handleDefaultStatusChange( newStatus: boolean, row: ErpAccountApi.Account, ): Promise { - return new Promise((resolve, reject) => { - const text = newStatus ? '设置' : '取消'; - confirm({ + const text = newStatus ? '设置' : '取消'; + try { + await confirm({ content: `确认要${text}"${row.name}"默认吗?`, - }) - .then(async () => { - // 更新默认状态 - await updateAccountDefaultStatus(row.id!, newStatus); - // 提示并返回成功 - message.success(`${text}默认成功`); - handleRefresh(); - resolve(true); - }) - .catch(() => { - reject(new Error('取消操作')); - }); - }); + }); + } catch { + return false; + } + // 更新默认状态 + await updateAccountDefaultStatus(row.id!, newStatus); + // 提示并返回成功 + message.success(`${text}默认成功`); + handleRefresh(); + return true; } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antd/src/views/erp/finance/payment/data.ts b/apps/web-antd/src/views/erp/finance/payment/data.ts index cd8e32712..771fd0c31 100644 --- a/apps/web-antd/src/views/erp/finance/payment/data.ts +++ b/apps/web-antd/src/views/erp/finance/payment/data.ts @@ -10,8 +10,11 @@ import { getSupplierSimpleList } from '#/api/erp/purchase/supplier'; import { getSimpleUserList } from '#/api/system/user'; import { getRangePickerDefaultProps } from '#/utils'; +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'edit'; + /** 表单的配置项 */ -export function useFormSchema(formType: string): VbenFormSchema[] { +export function useFormSchema(formType: FormType): VbenFormSchema[] { return [ { fieldName: 'id', diff --git a/apps/web-antd/src/views/erp/finance/payment/index.vue b/apps/web-antd/src/views/erp/finance/payment/index.vue index 03c88b777..d44b11be0 100644 --- a/apps/web-antd/src/views/erp/finance/payment/index.vue +++ b/apps/web-antd/src/views/erp/finance/payment/index.vue @@ -42,12 +42,12 @@ async function handleExport() { /** 新增付款单 */ function handleCreate() { - formModalApi.setData({ type: 'create' }).open(); + formModalApi.setData({ formType: 'create' }).open(); } /** 编辑付款单 */ function handleEdit(row: ErpFinancePaymentApi.FinancePayment) { - formModalApi.setData({ type: 'edit', id: row.id }).open(); + formModalApi.setData({ formType: 'edit', id: row.id }).open(); } /** 删除付款单 */ @@ -94,7 +94,7 @@ function handleRowCheckboxChange({ /** 查看详情 */ function handleDetail(row: ErpFinancePaymentApi.FinancePayment) { - formModalApi.setData({ type: 'detail', id: row.id }).open(); + formModalApi.setData({ formType: 'detail', id: row.id }).open(); } const [Grid, gridApi] = useVbenVxeGrid({ diff --git a/apps/web-antd/src/views/erp/finance/payment/modules/form.vue b/apps/web-antd/src/views/erp/finance/payment/modules/form.vue index 767bd13b2..25caa7b05 100644 --- a/apps/web-antd/src/views/erp/finance/payment/modules/form.vue +++ b/apps/web-antd/src/views/erp/finance/payment/modules/form.vue @@ -1,4 +1,6 @@