diff --git a/src/Add-on/Erp/ErpCommands.ts b/src/Add-on/Erp/ErpCommands.ts index 715685f58..9e2edd4a1 100644 --- a/src/Add-on/Erp/ErpCommands.ts +++ b/src/Add-on/Erp/ErpCommands.ts @@ -39,6 +39,7 @@ export class ShoWYouHua implements Command app.Editor.ModalManage.RenderModal(ErpView, { erpRoute: routeInfo, session: localStorage.getItem(StoreageKeys.PlatSession), + token: localStorage.getItem(StoreageKeys.PlatToken), cadData: null, store: store, }); @@ -114,6 +115,7 @@ async function ExecChaiDan(chaiDanRoute: ErpRoutes) app.Editor.ModalManage.RenderModal(ErpView, { erpRoute: routeInfo, session: localStorage.getItem(StoreageKeys.PlatSession), + token: localStorage.getItem(StoreageKeys.PlatToken), cadData: new ErpParseData().GetCadData(selction.boardList, selction.metalsList), store: store, }); diff --git a/src/Add-on/Erp/ErpView.tsx b/src/Add-on/Erp/ErpView.tsx index 4bbcbddf3..110f85590 100644 --- a/src/Add-on/Erp/ErpView.tsx +++ b/src/Add-on/Erp/ErpView.tsx @@ -4,7 +4,7 @@ import { ModalState } from "../../UI/Components/Modal/ModalInterface"; import { BoardStore } from "../../UI/Store/BoardStore"; import { ErpURL } from "./HostURL"; import { OrderDataBlock } from "./Models/CadBlock"; -import { OrderDataObject } from "./Models/CadObject"; +import { OrderDataObject, ProcessGroupObject } from "./Models/CadObject"; import { ErpRouteInfo } from "./Models/ErpRouteInfo"; import { ErpRoutes } from "./Models/ErpRoutes"; @@ -12,7 +12,8 @@ interface ErpViewProp { erpRoute: ErpRouteInfo; session: string; - cadData: { blockList: OrderDataBlock[], objectList: OrderDataObject[]; }; + token: string; + cadData: { blockList: OrderDataBlock[], objectList: OrderDataObject[]; processGroupList: ProcessGroupObject[]; }; store: BoardStore; } export class ErpView extends React.Component { @@ -55,7 +56,7 @@ export class ErpView extends React.Component { switch (this.props.erpRoute.RouteType) { case ErpRoutes.拆单: - this.postMessage("init", this.props.session); + this.postMessage("init", { token: this.props.token }); break; case ErpRoutes.拆单优化: this.postMessage("singleInit", { session: this.props.session, cadData: this.props.cadData }); @@ -64,7 +65,7 @@ export class ErpView extends React.Component { this.postMessage("singleInitJb", { session: this.props.session, cadData: this.props.cadData }); break; case ErpRoutes.优化查看: - this.postMessage("showSingle", this.props.session); + this.postMessage("showSingle", { session: this.props.session }); break; } window.addEventListener('message', this.closeEvent); diff --git a/src/Add-on/Erp/Models/CadBlock.ts b/src/Add-on/Erp/Models/CadBlock.ts index f0014fa89..0a0f5f288 100644 --- a/src/Add-on/Erp/Models/CadBlock.ts +++ b/src/Add-on/Erp/Models/CadBlock.ts @@ -1,5 +1,6 @@ export class OrderDataBlock { + ID: number; BoardName: string; BoardType: BoardType; BlockID: number; diff --git a/src/Add-on/Erp/Models/CadObject.ts b/src/Add-on/Erp/Models/CadObject.ts index f44f9a269..49eb62431 100644 --- a/src/Add-on/Erp/Models/CadObject.ts +++ b/src/Add-on/Erp/Models/CadObject.ts @@ -1,6 +1,9 @@ +import { Board } from "../../../DatabaseServices/Entity/Board"; + export class OrderDataObject { ID: number; + IsOffer: boolean = false; ParentID: number; Name: string; ObjectID: number; @@ -27,3 +30,17 @@ export class OrderDataObject ModuleDepth = 0; Remark: string; } +export class ProcessGroupObject +{ + //类型 + type: string; + //项目(抽屉1 抽屉2...) + projects: ProcessGroupProjObject[]; +} +export class ProcessGroupProjObject +{ + //项目名 + projName: string; + //板件id + brIds: number[]; +} diff --git a/src/Add-on/Erp/ParseData.ts b/src/Add-on/Erp/ParseData.ts index 3e2cf9c9b..2d374adae 100644 --- a/src/Add-on/Erp/ParseData.ts +++ b/src/Add-on/Erp/ParseData.ts @@ -9,7 +9,7 @@ import { FaceDirection, LinesType, BoardOpenDir } from "../../UI/Store/BoardInte import { OrderDataBlock, WaveType, CadType } from "./Models/CadBlock"; import { BasePosition, CadBlockHoles, CadBlockInfo, CadBlockModel, CadBlockModelPoint, CadBlockPoint, FaceType, HoleType } from "./Models/CadBlockInfo"; import { CadBlockBasePosition, CadBlockDrillings, CADDbBoard } from "./Models/CadModel"; -import { OrderDataObject } from "./Models/CadObject"; +import { OrderDataObject, ProcessGroupObject, ProcessGroupProjObject } from "./Models/CadObject"; import { Circle } from "../../DatabaseServices/Entity/Circle"; import { ConverCircleToPolyline } from "../../Common/CurveUtils"; import { equalv3, ZeroVec, AsVector2 } from "../../Geometry/GeUtils"; @@ -23,6 +23,7 @@ import { parseParts } from "./ParseParts"; import { HardwareTopline } from "../../DatabaseServices/Hardware/HardwareTopline"; import { Polyline } from "../../DatabaseServices/Entity/Polyline"; import { ICompHardwareOption } from "../../UI/Components/RightPanel/RightPanelInterface"; +import { ProcessingGroupRecord } from "../../DatabaseServices/ProcessingGroup/ProcessingGroupRecord"; enum FrontOrSide { 正面反面 = 0, @@ -30,20 +31,42 @@ enum FrontOrSide } export class ErpParseData { - FetchData(boardList: Board[], metalsList: IHardwareType[]): { blockList: OrderDataBlock[]; objectList: OrderDataObject[]; } + FetchData(boardList: Board[], metalsList: IHardwareType[]): { blockList: OrderDataBlock[]; objectList: OrderDataObject[]; processGroupObjectList: ProcessGroupObject[]; } { let blockList: OrderDataBlock[] = []; let objectList: OrderDataObject[] = []; + let processGroupObjectList: ProcessGroupObject[] = [];//加工组信息 + let pgMap: Map = new Map(); + let blockMap: Map = new Map(); + let blockIndex: number = 0; for (const entity of boardList) { + //处理加工组 if (entity instanceof Board) { + for (let pg of entity.ProcessingGroupList) + { + let g = pg.Object as ProcessingGroupRecord; + if (pgMap.has(g.Name)) + { + let gs = pgMap.get(g.Name); + if (gs.findIndex(gss => gss.Id.Index === g.Id.Index) === -1) + { + gs.push(g); + pgMap.set(g.Name, gs); + } + } + else + pgMap.set(g.Name, [g]); + } //房间名 let roomName = !entity.BoardProcessOption.roomName || entity.BoardProcessOption.roomName.length < 1 ? "未命名" : entity.BoardProcessOption.roomName; //柜体 let boxName = !entity.BoardProcessOption.cabinetName || entity.BoardProcessOption.cabinetName.length < 1 ? "未命名" : entity.BoardProcessOption.cabinetName; //板 let block = new OrderDataBlock(); + block.ID = blockIndex += 1; + blockMap.set(entity.Id.Index, block.ID); block.RoomName = roomName; block.BoxName = boxName; block.BoardName = entity.Name; //板名称 @@ -124,6 +147,24 @@ export class ErpParseData blockList.push(block); } } + //加工组信息整理 存入processGroupObjectList + for (let [str, pg] of pgMap) + { + pg.sort((pg1, pg2) => pg1.Id.Index - pg2.Id.Index); + let projs: ProcessGroupProjObject[] = []; + for (let [i, g] of pg.entries()) + { + let brids: number[] = []; + for (let obj of g.Objects) + { + if (!obj.Object || !(obj.Object instanceof Board)) + continue; + brids.push(blockMap.get(obj.Object.Id.Index)); + } + projs.push({ projName: g.Name + (i + 1).toString(), brIds: brids }); + } + processGroupObjectList.push({ type: str, projects: projs }); + } for (const entity of metalsList) { let spliteData = Production.GetHardwareData(entity as IHardwareType); @@ -138,7 +179,7 @@ export class ErpParseData parseParts(spliteData, objectList); } objectList.push(...this.GetAllDrillsObjects(boardList)); - return { blockList, objectList }; + return { blockList, objectList, processGroupObjectList }; } //取小数几位 GetNumberBit(value: number, bit: number): number @@ -564,7 +605,7 @@ export class ErpParseData return [b.L, b.W, b.H, b.CabName, b.BoardName, this.GetBasePositionArray(b.BasePoint), this.GetBasePositionArray(b.XVec), this.GetBasePositionArray(b.YVec), this.GetBasePositionArray(b.ZVec), b.Grain, this.GetVec2ListArray(b.Pts), b.Buls, this.GetCadModelArray(b.SubBoardLocal), this.GetCadModelArray(b.SubBoardAssoc), this.GetDrillingsListArray(b.Drillings)]; }); } - GetCadData(blockList: Board[], metalsList: IHardwareType[]): { blockList: OrderDataBlock[]; objectList: OrderDataObject[]; } + GetCadData(blockList: Board[], metalsList: IHardwareType[]): { blockList: OrderDataBlock[]; objectList: OrderDataObject[]; processGroupObjectList: ProcessGroupObject[]; } { return this.FetchData(blockList, metalsList); } diff --git a/src/Add-on/Erp/ParseParts.ts b/src/Add-on/Erp/ParseParts.ts index 513ebebfd..07eaf3e04 100644 --- a/src/Add-on/Erp/ParseParts.ts +++ b/src/Add-on/Erp/ParseParts.ts @@ -5,12 +5,11 @@ import { EMetalsType, ICompHardwareOption } from "../../UI/Components/RightPanel import { OrderDataObject } from "./Models/CadObject"; import { ISpliteHardwareData } from '../../Production/Product'; -export function parseParts(spliteData: ISpliteHardwareData, list: OrderDataObject[], parentID: number = 0) +export function parseParts(spliteData: ISpliteHardwareData, list: OrderDataObject[], parent: OrderDataObject = null) { let info = spliteData.metalsOption as ICompHardwareOption; let parts = new OrderDataObject(); parts.ID = list.length + 1; - parts.ParentID = parentID; parts.RoomName = info.roomName.length == 0 ? '未命名' : info.roomName; parts.BoxName = info.cabinetName.length == 0 ? '未命名' : info.cabinetName; parts.Brand = info.brand; @@ -32,23 +31,44 @@ export function parseParts(spliteData: ISpliteHardwareData, list: OrderDataObjec parts.Spec = specList.join('|'); parts.Units = info.unit; parts.Model = info.model; - parts.SalePrice = Number(info.actualExpr.length === 0 ? 0 : info.actualExpr); + parts.SalePrice = Number(Number(info.actualExpr.length === 0 ? 0 : info.actualExpr).toFixed(2)); + if (parent && parent.ID > 0) + { + if (parent.IsOffer) + { + parts.SalePrice = 0; + } else + { + parts.IsOffer = true; + } + } + if (parent) + { + parts.RoomName = parent.RoomName; + parts.BoxName = parent.BoxName; + } parts.IsComposite = info.type === EMetalsType.Comp ? true : false; - parts.Name = info.name; parts.ObjectType = info.name; parts.Num = Number(info.count); - - - list.push(parts); - if (info.isSplite && spliteData.children.length > 0) { + if (info.isSplitePrice == false) // 父五金作为报价信息 + { + parts.IsOffer = true; + list.push(parts); + + } else // 2个都勾选,只有子五金 + { + parts.ID = -1; + } + parent = parts; for (const child of spliteData.children) { - parseParts(child, list, parts.ID); + parseParts(child, list, parent); } + } else + { + list.push(parts); } - - } diff --git a/src/Common/StoreageKeys.ts b/src/Common/StoreageKeys.ts index 1e5b4f9ca..39625f382 100644 --- a/src/Common/StoreageKeys.ts +++ b/src/Common/StoreageKeys.ts @@ -2,6 +2,7 @@ export enum StoreageKeys { IsLogin = "isLogin", PlatSession = "platSession", + PlatToken = "platToken", UserName = "userName", RenderType = "renderType", ExactDrill = "openExactDrill", diff --git a/src/DatabaseServices/3DSolid/SweepSolid.ts b/src/DatabaseServices/3DSolid/SweepSolid.ts index 698d1d7d8..0f8c21c5a 100644 --- a/src/DatabaseServices/3DSolid/SweepSolid.ts +++ b/src/DatabaseServices/3DSolid/SweepSolid.ts @@ -192,7 +192,7 @@ export class SweepSolid extends Entity } get BoundingBox() { - return new Box3Ext().setFromPoints(this.GetStretchPoints()); + return new Box3Ext().setFromPoints(this.GetEndPoints()); } get OBB(): OBB { diff --git a/src/Production/Product.ts b/src/Production/Product.ts index 6653d62d9..0d5d83c59 100644 --- a/src/Production/Product.ts +++ b/src/Production/Product.ts @@ -745,33 +745,31 @@ export namespace Production children: [], }; - if (en instanceof HardwareCompositeEntity && (en.HardwareOption.isSplitePrice || en.HardwareOption.isSplitePrice)) + if (en instanceof HardwareCompositeEntity && (en.HardwareOption.isSplite || en.HardwareOption.isSplitePrice)) { - let actualPrice = 0; + if (en.Entitys.every(e => !(e instanceof HardwareCompositeEntity || e instanceof HardwareTopline))) + return metalData; + // let costPrice = 0; + // let actualPrice = 0; for (let e of en.Entitys) { if (e instanceof HardwareCompositeEntity || e instanceof HardwareTopline) { - let d: ISpliteHardwareData; - - if (en.HardwareOption.isSplite) - { - d = GetHardwareData(e); - metalData.children.push(d); - } - if (en.HardwareOption.isSplitePrice) - { - if (!d) - d = GetHardwareData(e); - actualPrice += parseFloat(d.metalsOption.actualExpr) ?? 0; - } + let d = GetHardwareData(e); + metalData.children.push(d); + // if (en.HardwareOption.isSplitePrice) + // { + // costPrice += parseFloat(d.metalsOption.costExpr) ?? 0; + // actualPrice += parseFloat(d.metalsOption.actualExpr) ?? 0; + // } } } - if (en.HardwareOption.isSplitePrice) - { - metalData.metalsOption.actualExpr = actualPrice.toString(); - } + // if (en.HardwareOption.isSplitePrice) + // { + // metalData.metalsOption.costExpr = costPrice.toString(); + // metalData.metalsOption.actualExpr = actualPrice.toString(); + // } } return metalData; diff --git a/src/UI/Components/MainContent/Login.tsx b/src/UI/Components/MainContent/Login.tsx index 1701cfc12..9c7fc9538 100644 --- a/src/UI/Components/MainContent/Login.tsx +++ b/src/UI/Components/MainContent/Login.tsx @@ -23,6 +23,7 @@ export function saveLoginInfos(data: IResponseData) { localStorage.setItem(StoreageKeys.IsLogin, "1"); localStorage.setItem(StoreageKeys.PlatSession, data.session); + localStorage.setItem(StoreageKeys.PlatToken, data.token); localStorage.setItem(StoreageKeys.UserName, data.user_info.login_name); localStorage.setItem(StoreageKeys.IsNewErp, data.user_info.new_erp); localStorage.setItem(StoreageKeys.Uid, data.user_info.user_id);