fastlion-amis
Version:
一种MIS页面生成工具
242 lines (225 loc) • 8.27 kB
text/typescript
import { SchemaCollection } from ".."
import { expressLabels, IExpress } from "../renderers/Lion/ExpressPrint/ExpressPrint"
import { Api } from "../types"
import { Shell } from "./shell"
import MSG from '../renderers/Lion/utils/msgsub';
import { message } from "antd";
import { isMobile } from "./helper";
import { getDestoryResult, getModifyResult, windowRFIDTriger } from "./RfidUtil";
import { buildLabelTemplate, setLabelTemplateData } from "./print/util";
import { labelPrint } from "./print";
interface ScanAfterLabelPrint {
labelData: any[]
labelTemplate: any
labelPrinter: string
}
interface FrontPort {
afterApi: Api
bodyList: { EPC: string }[]
actionName: string
EPC: string
portId: 'rfid-in-stock' | 'rfid-sold' | 'rfid-scrap' | 'rfid-been-dispatched'
}
interface ScanAfterPort {
afterApi?: Api
body: IExpress
}
interface ScanAfterShow {
showType: 0 | 1 | 2 | 10 | 11 | 12
showMsg: string
afterApi?: Api
}
interface ScanAfterVars {
afterApi: Api
body: SchemaCollection
data: object
}
export interface ScanAfterDo {
cmd: 'STEP_PRINT_LABEL' | 'STEP_PORT' | 'STEP_SHOW' | 'STEP_VARS' | 'STEP_FRONT_PORT'
body: ScanAfterLabelPrint | ScanAfterPort | ScanAfterShow | ScanAfterVars | FrontPort
}
// rfid keystep功能port enum
enum RFIDPortIdEnum {
RFIDINSTOCK = 'rfid-in-stock', // 在库
RFIDSOLD = 'rfid-sold', // 已售
RFIDSCRAP = 'rfid-scrap', // 废弃
RFIDBEENDISPATCHED = 'rfid-been-dispatched', // 调出
RFIDEPCOVERWRITE = 'rfid-epc-overwrite', // 覆写
RFIDEPCDESTORY = 'rfid-epc-destory', // 销毁
ACTRFID = 'actRfid' // 广播触发
}
// 专门处理epc用的
export const epc_front_port = async (element: ScanAfterDo, data: any, env: any) => {
let error = false
let errorData = ''
let payload
const body = element.body as FrontPort
const bodyList = body.bodyList // 获取需要设置的请求体
const portId = body.portId // 获取需要设置的请求体
// portId对应的状态码
const statusMap = isMobile() ? {
[RFIDPortIdEnum.RFIDINSTOCK]: 0x00, // 在库
[RFIDPortIdEnum.RFIDSOLD]: 0x10, // 已销售
[RFIDPortIdEnum.RFIDBEENDISPATCHED]: 0x20, // 已调出
[RFIDPortIdEnum.RFIDSCRAP]: 0x30, // 已废弃
} : {
[RFIDPortIdEnum.RFIDINSTOCK]: '0', // 在库
[RFIDPortIdEnum.RFIDSOLD]: '1', // 已销售
[RFIDPortIdEnum.RFIDBEENDISPATCHED]: '2', // 已调出
[RFIDPortIdEnum.RFIDSCRAP]: '3', // 已废弃
} // pc端的比较简单 直接写入就行
const epcList = bodyList?.filter(_ => _.EPC).map(_ => _.EPC)
// const epcList = ['38739204B0100000001']
// 固定取bodyList里面的东西 方便处理
switch (portId as RFIDPortIdEnum) {
case RFIDPortIdEnum.RFIDINSTOCK:
case RFIDPortIdEnum.RFIDSOLD:
case RFIDPortIdEnum.RFIDSCRAP:
case RFIDPortIdEnum.RFIDBEENDISPATCHED:
if (epcList.length) {
message.loading('写入中')
const res: any = await getModifyResult(epcList, statusMap[portId])
message.destroy()
console.log('结果', JSON.stringify(res))
const failList = res?.data?.failList
if (failList.length) {
error = true
errorData = failList
// 调整下一次要处理的列表
body.bodyList = failList.map((_: string) => ({ EPC: _ }))
message.warn(`写入失败epc码,${failList.join(',')}`)
} else {
message.success(`写入成功`)
}
} else {
message.warn('需要设置的EPC码为空')
}
break;
case RFIDPortIdEnum.RFIDEPCDESTORY:
if (epcList.length) {
message.loading('销毁中', 10 * 1000)
const res: any = await getDestoryResult(epcList)
message.destroy()
if (!res?.data.epcList?.length) {
message.success('销毁成功 ')
} else {
if (res?.data.epcList?.length) {
error = true
errorData = res?.data.epcList
message.warn(res.data.epcList.join(',') + `未销毁`)
} else {
message.warn(`写入失败`)
}
}
console.log(JSON.stringify(res), '写入结果')
} else {
message.warn('需要销毁的EPC码为空')
}
break;
case RFIDPortIdEnum.ACTRFID: {
// 给个默认的名字
const actionName = body.actionName || 'actRfid'
windowRFIDTriger.actEvent({ type: actionName })
break;
}
default:
message.warn('未指定的portId')
break;
}
if (body.afterApi) {
payload = await env.fetcher(body.afterApi, data)
}
return {
error,
errorData,
payload,
}
}
// keyStep脚本函数 专门处理keyStep脚本,识别到有通用化的趋势,故此抽出
// 第一个是执行剩下的按钮用的
export const KeyStepCommonFunction = async (scanAfterDo: ScanAfterDo[], data: any, env: any, props?: any, errorHandle?: (restScanDo: ScanAfterDo[], data: any, env: any, errorData: any) => any, reloadFun?: () => any) => {
for (const key in scanAfterDo) {
if (Object.prototype.hasOwnProperty.call(scanAfterDo, key)) {
const element = scanAfterDo[key];
const cmd = element.cmd
let outFlag = false // 中断标识
let payload // 返回集中存放
let errorData = undefined // 错误数据 用于判断
switch (cmd) {
case "STEP_FRONT_PORT": {
const result = await epc_front_port(element, data, env)
outFlag = result.error
payload = result.payload
errorData = result.errorData
break;
}
case 'STEP_PORT':
const portBody = element.body as ScanAfterPort
await expressLabels(portBody?.body, env.fetcher, props?.translate, props?.showModal === 1)
if (portBody.afterApi) {
payload = await env.fetcher(portBody.afterApi, data)
}
break
case 'STEP_SHOW':
const body = element.body as ScanAfterShow
const { showMsg, showType, afterApi } = body
if (showType == 10 || showType == 11 || showType == 12) {
if (isMobile() && Shell.hasShell()) Shell.readVoice(showMsg)
}
if (showType == 0 || showType == 10) {
// 有更新方法执行更行
reloadFun?.()
MSG._info(showMsg)
if (afterApi) {
payload = await env.fetcher(afterApi, data)
}
} else if (showType == 1 || showType == 11) {
const confirm = await env.confirm(showMsg)
if (confirm && afterApi) {
payload = await env.fetcher(afterApi, data)
}
} else if (showType == 2 || showType == 12) {
env.confirm(showMsg, undefined, undefined, false)
}
break
case 'STEP_VARS':
const varsBody = element.body as ScanAfterVars
const formData = await env.prompt(varsBody.body, varsBody.data)
if (formData !== false && varsBody.afterApi) {
payload = await env.fetcher(varsBody.afterApi, { ...formData, ...data })
}
break
case 'STEP_PRINT_LABEL':
const printBody = element.body as ScanAfterLabelPrint
const baseUrl = env.axiosInstance?.defaults?.baseURL ?? ''
const labelTemplate = buildLabelTemplate(printBody.labelTemplate.tempContent)
const templateDatas = setLabelTemplateData(labelTemplate, printBody.labelData, baseUrl)
labelPrint({
templateDatas,
marginTop: 0,
marginLeft: 0,
pageWidth: printBody.labelTemplate.width || 210,
pageHeight: printBody.labelTemplate.height || 297,
direction: true,
preview: false,
printer: printBody.labelPrinter,
count: 1
})
break
default:
break
}
if (outFlag) {
errorHandle?.(scanAfterDo.slice(+key), data, env, errorData)
return
}
if (payload) {
if (payload.ok && payload.status == 20003) {
await KeyStepCommonFunction(payload.data.scanAfterDo, data, env, props, errorHandle, reloadFun)
} else {
payload.msg && MSG._warning(payload.msg)
}
}
}
}
}