Commit 79d4a3b6382feec60612ea413cc58e5ca1310705

Authored by jiangwei
1 parent 71a2ef45

计划管理增加草稿和继续编辑功能

src/pages/pms/partPlan/PlanManage/api.ts
@@ -26,7 +26,7 @@ export interface ListVO { @@ -26,7 +26,7 @@ export interface ListVO {
26 planDate?: string; // 计划日期 26 planDate?: string; // 计划日期
27 approvalOrderNo?: string; // 审核单号 27 approvalOrderNo?: string; // 审核单号
28 userName?: string; // 计划人员 28 userName?: string; // 计划人员
29 - status?: string; // 计划状态 1:待审核2:已通过9:已拒绝 29 + status?: number; // 计划状态 1:待审核2:已通过9:已拒绝
30 settleShopId?: string; // 结算门店门店id 30 settleShopId?: string; // 结算门店门店id
31 settleShopName?: string; // 结算门店名称 31 settleShopName?: string; // 结算门店名称
32 prepayToken?: string; // 预付token 32 prepayToken?: string; // 预付token
src/pages/pms/partPlan/PlanManage/index.tsx
@@ -13,6 +13,7 @@ import DetailModal from "@/pages/pms/partPlan/PlanManage/components/DetailModal" @@ -13,6 +13,7 @@ import DetailModal from "@/pages/pms/partPlan/PlanManage/components/DetailModal"
13 13
14 // 计划状态 1:待审核2:已通过3待付款4已付款9:已拒绝 14 // 计划状态 1:待审核2:已通过3待付款4已付款9:已拒绝
15 const statusName: {[key: number]: string} = { 15 const statusName: {[key: number]: string} = {
  16 + 0: '草稿',
16 1: '待审核', 17 1: '待审核',
17 2: '已通过', 18 2: '已通过',
18 3: '待付款', 19 3: '待付款',
@@ -69,6 +70,7 @@ export default function Index() { @@ -69,6 +70,7 @@ export default function Index() {
69 onChange={v => setParams({status: v }, true)} 70 onChange={v => setParams({status: v }, true)}
70 optionFilterProp="children" 71 optionFilterProp="children"
71 > 72 >
  73 + <Select.Option value={0} key={0}>草稿</Select.Option>
72 <Select.Option value={1} key={1}>待审核</Select.Option> 74 <Select.Option value={1} key={1}>待审核</Select.Option>
73 <Select.Option value={2} key={2}>已通过</Select.Option> 75 <Select.Option value={2} key={2}>已通过</Select.Option>
74 <Select.Option value={9} key={9}>已拒绝</Select.Option> 76 <Select.Option value={9} key={9}>已拒绝</Select.Option>
@@ -95,9 +97,16 @@ export default function Index() { @@ -95,9 +97,16 @@ export default function Index() {
95 fixed="right" 97 fixed="right"
96 render={(text, _item: ListVO) => ( 98 render={(text, _item: ListVO) => (
97 <> 99 <>
98 - <a onClick={() => history.push(`/pms/partPlan/planManage/detail/${_item.planId}`)}>  
99 - 查看  
100 - </a> 100 + {[0, 9].includes(_item.status || 0) ? (
  101 + <a onClick={() => history.push(`/pms/partPlan/planManage/apply?planId=${_item.planId}`)}>
  102 + 编辑
  103 + </a>
  104 + )
  105 + : (
  106 + <a onClick={() => history.push(`/pms/partPlan/planManage/detail/${_item.planId}`)}>
  107 + 查看
  108 + </a>
  109 + )}
101 <Divider type="vertical" /> 110 <Divider type="vertical" />
102 <a onClick={() => { 111 <a onClick={() => {
103 setItem(_item); 112 setItem(_item);
src/pages/pms/partPlan/PlanManage/subpages/Apply/api.ts
@@ -16,3 +16,9 @@ export interface SaveParams { @@ -16,3 +16,9 @@ export interface SaveParams {
16 export function saveApi(params?: SaveParams): http.PromiseResp<void> { 16 export function saveApi(params?: SaveParams): http.PromiseResp<void> {
17 return request.post(`${PMS_HOST}/erp/plan/pool/save/plan`, params); 17 return request.post(`${PMS_HOST}/erp/plan/pool/save/plan`, params);
18 } 18 }
  19 +/**
  20 + * 草稿
  21 + */
  22 +export function draftApi(params?: SaveParams): http.PromiseResp<void> {
  23 + return request.post(`${PMS_HOST}/erp/plan/pool/save/draft`, params);
  24 +}
src/pages/pms/partPlan/PlanManage/subpages/Apply/components/DealerModal.tsx
@@ -11,9 +11,9 @@ interface Props { @@ -11,9 +11,9 @@ interface Props {
11 } 11 }
12 const {Option} = Select; 12 const {Option} = Select;
13 export default function Index({ onCancel, visible, onOk, dealerList = [] }: Props) { 13 export default function Index({ onCancel, visible, onOk, dealerList = [] }: Props) {
14 - const [dealer, setDealer] = useState<any>({dealerId: null, dealerName: null}); 14 + const [dealer, setDealer] = useState<any>({ settleDealerId: null, settleDealerName: null});
15 const { data: dealers } = useInitail<CommonApi.OptionVO[], CommonApi.DealerParam>(getDealerApi, [], {}); 15 const { data: dealers } = useInitail<CommonApi.OptionVO[], CommonApi.DealerParam>(getDealerApi, [], {});
16 - const suIds = dealerList.map(it => it.dealerId); 16 + const suIds = dealerList.map(it => it.settleDealerId);
17 17
18 useEffect(() => { 18 useEffect(() => {
19 if (!visible) { 19 if (!visible) {
@@ -22,7 +22,7 @@ export default function Index({ onCancel, visible, onOk, dealerList = [] }: Prop @@ -22,7 +22,7 @@ export default function Index({ onCancel, visible, onOk, dealerList = [] }: Prop
22 }, [visible]); 22 }, [visible]);
23 23
24 const handSave = () => { 24 const handSave = () => {
25 - if (!dealer.dealerId) { 25 + if (!dealer.settleDealerId) {
26 message.error('请选择采购商家'); 26 message.error('请选择采购商家');
27 return; 27 return;
28 } 28 }
@@ -40,7 +40,7 @@ export default function Index({ onCancel, visible, onOk, dealerList = [] }: Prop @@ -40,7 +40,7 @@ export default function Index({ onCancel, visible, onOk, dealerList = [] }: Prop
40 <Button key="cancel" onClick={onCancel}>取消</Button>, 40 <Button key="cancel" onClick={onCancel}>取消</Button>,
41 <Button 41 <Button
42 key="submit" 42 key="submit"
43 - disabled={!dealer.dealerId} 43 + disabled={!dealer.settleDealerId}
44 onClick={handSave} 44 onClick={handSave}
45 type="primary" 45 type="primary"
46 htmlType="submit" 46 htmlType="submit"
@@ -52,14 +52,14 @@ export default function Index({ onCancel, visible, onOk, dealerList = [] }: Prop @@ -52,14 +52,14 @@ export default function Index({ onCancel, visible, onOk, dealerList = [] }: Prop
52 <div style={{display: 'flex', flexDirection: 'row', alignItems: 'center', marginBottom: 10}}> 52 <div style={{display: 'flex', flexDirection: 'row', alignItems: 'center', marginBottom: 10}}>
53 <span>商家:</span> 53 <span>商家:</span>
54 <Select 54 <Select
55 - value={dealer.dealerId} 55 + value={dealer.settleDealerId}
56 style={{ width: 250 }} 56 style={{ width: 250 }}
57 placeholder="请选择商家" 57 placeholder="请选择商家"
58 showSearch 58 showSearch
59 optionFilterProp="children" 59 optionFilterProp="children"
60 - onChange={(dealerId) => {  
61 - const d = dealers.find(it => it.id == dealerId) || {};  
62 - setDealer({dealerId, dealerName: d.name}); 60 + onChange={(settleDealerId) => {
  61 + const d = dealers.find(it => it.id == settleDealerId) || {};
  62 + setDealer({ settleDealerId, settleDealerName: d.name});
63 }} 63 }}
64 > 64 >
65 {dealers.filter(it => !suIds.includes(it.id)).map((b) => ( 65 {dealers.filter(it => !suIds.includes(it.id)).map((b) => (
src/pages/pms/partPlan/PlanManage/subpages/Apply/index.tsx
@@ -8,16 +8,24 @@ import {throttle, sum} from &#39;lodash&#39;; @@ -8,16 +8,24 @@ import {throttle, sum} from &#39;lodash&#39;;
8 import useInitial from "@/hooks/useInitail"; 8 import useInitial from "@/hooks/useInitail";
9 import * as API from "@/common/api"; 9 import * as API from "@/common/api";
10 import {getList, Params, ListVO} from "@/pages/pms/partPlan/PlanPool/api"; 10 import {getList, Params, ListVO} from "@/pages/pms/partPlan/PlanPool/api";
11 -import {saveApi} from './api'; 11 +import {saveApi, draftApi} from './api';
12 import zhCN from "antd/lib/locale-provider/zh_CN"; 12 import zhCN from "antd/lib/locale-provider/zh_CN";
13 import st from "@/pages/pms/partPlan/PlanManage/style.less"; 13 import st from "@/pages/pms/partPlan/PlanManage/style.less";
14 -import StepBnt from "@/pages/pms/comonents/StepBnt";  
15 import PartModal from "@/pages/pms/partPlan/PlanManage/subpages/Apply/components/PartModal"; 14 import PartModal from "@/pages/pms/partPlan/PlanManage/subpages/Apply/components/PartModal";
16 import {groupBys, flattenDeep} from '@/pages/pms/entity'; 15 import {groupBys, flattenDeep} from '@/pages/pms/entity';
17 import {PartDetail} from '../../api'; 16 import {PartDetail} from '../../api';
  17 +import { history } from 'umi';
  18 +import { getDetail, DetailVO, Params as detailParams } from '../Detail/api';
18 19
19 const { Option } = Select; 20 const { Option } = Select;
  21 +const apiObj: { [key: number]: any } = {
  22 + 1: saveApi,
  23 + 2: draftApi
  24 +};
20 export default function Index() { 25 export default function Index() {
  26 + const planId = history.location.query;
  27 + const [detaildelay, setDetaildelay] = useState(true);
  28 + const { data, setParams: detailsetParams } = useInitial<DetailVO[], detailParams>(getDetail, [], { ...planId }, detaildelay);
21 const [delay, setDelay] = useState<boolean>(true); 29 const [delay, setDelay] = useState<boolean>(true);
22 const [loading, setLoading] = useState<boolean>(false); 30 const [loading, setLoading] = useState<boolean>(false);
23 const { data: brands } = useInitial(API.getBrandFilterApi, [], {}); 31 const { data: brands } = useInitial(API.getBrandFilterApi, [], {});
@@ -32,9 +40,25 @@ export default function Index() { @@ -32,9 +40,25 @@ export default function Index() {
32 const partList = flattenDeep(dealerList.map(it => (it.suppliers || []).map((su: any) => (su.storages || []).map((st: any) => (st.parts || []))))); 40 const partList = flattenDeep(dealerList.map(it => (it.suppliers || []).map((su: any) => (su.storages || []).map((st: any) => (st.parts || [])))));
33 const poolIds = partList.map((it: any) => it.poolId); 41 const poolIds = partList.map((it: any) => it.poolId);
34 42
  43 + useEffect(() => {
  44 + if (planId?.planId) {
  45 + setDetaildelay(false);
  46 + detailsetParams({ ...planId }, true);
  47 + }
  48 + }, []);
  49 +
  50 + useEffect(() => {
  51 + if (data.length) {
  52 + setDfParams({brandId: data[0].brandId});
  53 + setParams({}, true);
  54 + setDelay(false);
  55 + setDealerList(data);
  56 + }
  57 + }, [data.length]);
  58 +
35 function onOk(parts: ListVO[] = []) { 59 function onOk(parts: ListVO[] = []) {
36 setDealerList(dealerList.map(it => { 60 setDealerList(dealerList.map(it => {
37 - if (it.dealerId == dealer.dealerId) { 61 + if (it.settleDealerId == dealer.settleDealerId) {
38 return { 62 return {
39 ...it, 63 ...it,
40 suppliers: (it.suppliers || []).map((su: any) => { 64 suppliers: (it.suppliers || []).map((su: any) => {
@@ -64,7 +88,7 @@ export default function Index() { @@ -64,7 +88,7 @@ export default function Index() {
64 88
65 function onOkSupplier(supplier: any = {}) { 89 function onOkSupplier(supplier: any = {}) {
66 setDealerList(dealerList.map(it => { 90 setDealerList(dealerList.map(it => {
67 - if (it.dealerId == dealer.dealerId) { 91 + if (it.settleDealerId == dealer.settleDealerId) {
68 return { 92 return {
69 ...it, 93 ...it,
70 suppliers: [...(it.suppliers || []), supplier] 94 suppliers: [...(it.suppliers || []), supplier]
@@ -76,7 +100,7 @@ export default function Index() { @@ -76,7 +100,7 @@ export default function Index() {
76 100
77 function deleteSupplier(dealer: any = {}, supplier: any = {}) { 101 function deleteSupplier(dealer: any = {}, supplier: any = {}) {
78 setDealerList(dealerList.map(it => { 102 setDealerList(dealerList.map(it => {
79 - if (it.dealerId == dealer.dealerId) { 103 + if (it.settleDealerId == dealer.settleDealerId) {
80 return { 104 return {
81 ...it, 105 ...it,
82 suppliers: (it.suppliers || []).filter((su: any) => su.supplierId != supplier.supplierId) 106 suppliers: (it.suppliers || []).filter((su: any) => su.supplierId != supplier.supplierId)
@@ -88,7 +112,7 @@ export default function Index() { @@ -88,7 +112,7 @@ export default function Index() {
88 112
89 function deletePart(dealer: any = {}, supplier: any = {}, storage: any = {}, part: any = {}) { 113 function deletePart(dealer: any = {}, supplier: any = {}, storage: any = {}, part: any = {}) {
90 setDealerList(dealerList.map(it => { 114 setDealerList(dealerList.map(it => {
91 - if (it.dealerId == dealer.dealerId) { 115 + if (it.settleDealerId == dealer.settleDealerId) {
92 return { 116 return {
93 ...it, 117 ...it,
94 suppliers: (it.suppliers || []).map((su: any) => { 118 suppliers: (it.suppliers || []).map((su: any) => {
@@ -116,7 +140,7 @@ export default function Index() { @@ -116,7 +140,7 @@ export default function Index() {
116 140
117 function deleteStorage(dealer: any = {}, supplier: any = {}, storage: any = {}) { 141 function deleteStorage(dealer: any = {}, supplier: any = {}, storage: any = {}) {
118 setDealerList(dealerList.map(it => { 142 setDealerList(dealerList.map(it => {
119 - if (it.dealerId == dealer.dealerId) { 143 + if (it.settleDealerId == dealer.settleDealerId) {
120 return { 144 return {
121 ...it, 145 ...it,
122 suppliers: (it.suppliers || []).map((su: any) => { 146 suppliers: (it.suppliers || []).map((su: any) => {
@@ -134,31 +158,33 @@ export default function Index() { @@ -134,31 +158,33 @@ export default function Index() {
134 })); 158 }));
135 } 159 }
136 160
137 - // useEffect(() => {  
138 - // if (dfParams.brandId) {  
139 - // setParams(dfParams, true);  
140 - // setDelay(false);  
141 - // }  
142 - // }, [dfParams.brandId]);  
143 -  
144 - const onSubmit = throttle(() => { 161 + const onSubmit = throttle((isSave) => {
145 setLoading(true); 162 setLoading(true);
146 let suppliers = flattenDeep(dealerList.map(de => (de.suppliers || []).map((su: any) => ({...de, ...su})))); 163 let suppliers = flattenDeep(dealerList.map(de => (de.suppliers || []).map((su: any) => ({...de, ...su}))));
147 suppliers = suppliers.map(su => ({ 164 suppliers = suppliers.map(su => ({
148 ...su, 165 ...su,
149 - settleDealerId: su.dealerId, 166 + settleDealerId: su.settleDealerId,
150 storages: (su.storages || []).map((st: any) => ({ 167 storages: (su.storages || []).map((st: any) => ({
151 storageId: st.storageId, 168 storageId: st.storageId,
152 poolIds: (st.parts || []).map((pa: any) => pa.poolId) 169 poolIds: (st.parts || []).map((pa: any) => pa.poolId)
153 })) 170 }))
154 })); 171 }));
155 - saveApi({ 172 + const type = isSave ? 1 : 2;
  173 + apiObj[type]({
  174 + planId: planId?.planId,
156 ...dfParams, 175 ...dfParams,
157 suppliers 176 suppliers
  177 + // suppliers: suppliers.map(i => ({
  178 + // settleDealerId: i.settleDealerId,
  179 + // settleDealerName: i.settleDealerName,
  180 + // supplierId: i.supplierId,
  181 + // supplierName: i.supplierName,
  182 + // storages: i.storages
  183 + // }))
158 }).then(() => { 184 }).then(() => {
159 setLoading(false); 185 setLoading(false);
160 - history.back();  
161 - }).catch(e => { 186 + history.goBack();
  187 + }).catch((e: any) => {
162 setLoading(false); 188 setLoading(false);
163 message.error(e.message); 189 message.error(e.message);
164 }); 190 });
@@ -204,15 +230,15 @@ export default function Index() { @@ -204,15 +230,15 @@ export default function Index() {
204 </a> 230 </a>
205 </div> 231 </div>
206 {dealerList.map((dealer: any = {}) => ( 232 {dealerList.map((dealer: any = {}) => (
207 - <div key={`dealer${dealer.dealerId}`} style={{ marginTop: 10 }}> 233 + <div key={`dealer${dealer.settleDealerId}`} style={{ marginTop: 10 }}>
208 <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center'}}> 234 <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center'}}>
209 - <div style={{ fontWeight: "bold" }}>{`商家: ${dealer.dealerName || ''}`}</div> 235 + <div style={{ fontWeight: "bold" }}>{`商家: ${dealer.settleDealerName || ''}`}</div>
210 <a style={{marginLeft: 40}} onClick={() => { setVisibleSupplier(true); setDealer(dealer); }}> 236 <a style={{marginLeft: 40}} onClick={() => { setVisibleSupplier(true); setDealer(dealer); }}>
211 添加指定供应商 237 添加指定供应商
212 </a> 238 </a>
213 <Popconfirm 239 <Popconfirm
214 title="是否删除" 240 title="是否删除"
215 - onConfirm={() => setDealerList(dealerList.filter(it => it.dealerId!=dealer.dealerId))} 241 + onConfirm={() => setDealerList(dealerList.filter(it => it.settleDealerId!=dealer.settleDealerId))}
216 okText="确定" 242 okText="确定"
217 cancelText="取消" 243 cancelText="取消"
218 style={{marginLeft: 20}} 244 style={{marginLeft: 20}}
@@ -224,8 +250,6 @@ export default function Index() { @@ -224,8 +250,6 @@ export default function Index() {
224 </div> 250 </div>
225 {(dealer.suppliers || []).map((supplier: any = {}) => { 251 {(dealer.suppliers || []).map((supplier: any = {}) => {
226 const paList: any[] = flattenDeep((supplier.storages || []).map((st: any) => (st.parts || []))); 252 const paList: any[] = flattenDeep((supplier.storages || []).map((st: any) => (st.parts || [])));
227 - // const paList: any[] = pas.length > 0 ? pas[0] : [];  
228 - console.log('pas', paList);  
229 return ( 253 return (
230 <div key={`supplier${supplier.supplierId}`} style={{ marginTop: 10, marginLeft: 40 }}> 254 <div key={`supplier${supplier.supplierId}`} style={{ marginTop: 10, marginLeft: 40 }}>
231 <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center'}}> 255 <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center'}}>
@@ -247,7 +271,7 @@ export default function Index() { @@ -247,7 +271,7 @@ export default function Index() {
247 </div> 271 </div>
248 <div style={{display: 'flex', marginLeft: 40, marginTop: 10}}> 272 <div style={{display: 'flex', marginLeft: 40, marginTop: 10}}>
249 <div style={{marginRight: 20}}> 273 <div style={{marginRight: 20}}>
250 - {`总金额: ${sum(paList.map((it: any) => (it.price || 0) * (it.count || 0))).toFixed(2)}元`} 274 + {`总金额: ${sum(paList.map((it: any) => (it.price || 0) * (it.count || it.partCnt || 0))).toFixed(2)}元`}
251 </div> 275 </div>
252 <div>{`品种数: ${[...new Set((paList || []).map((i: PartDetail) => i.partCode))].length}种`}</div> 276 <div>{`品种数: ${[...new Set((paList || []).map((i: PartDetail) => i.partCode))].length}种`}</div>
253 </div> 277 </div>
@@ -255,7 +279,7 @@ export default function Index() { @@ -255,7 +279,7 @@ export default function Index() {
255 <div key={`storage${storage.storageId}`} style={{ marginTop: 10, marginLeft: 60 }}> 279 <div key={`storage${storage.storageId}`} style={{ marginTop: 10, marginLeft: 60 }}>
256 <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center'}}> 280 <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center'}}>
257 <div style={{ fontWeight: "bold" }}>{`发运库房: ${storage.storageName || ''}`}</div> 281 <div style={{ fontWeight: "bold" }}>{`发运库房: ${storage.storageName || ''}`}</div>
258 - <div style={{marginLeft: 20}}>{`总金额: ${sum((storage.parts || []).map((it: any) => (it.price || 0) * (it.count || 0))).toFixed(2)}元`}</div> 282 + <div style={{marginLeft: 20}}>{`总金额: ${sum((storage.parts || []).map((it: any) => (it.price || 0) * (it.count || it.partCnt || 0))).toFixed(2)}元`}</div>
259 <div style={{marginLeft: 20}}>{`品种数: ${[...new Set((storage.parts || []).map((i: PartDetail) => i.partCode))].length}种`}</div> 283 <div style={{marginLeft: 20}}>{`品种数: ${[...new Set((storage.parts || []).map((i: PartDetail) => i.partCode))].length}种`}</div>
260 <a style={{marginLeft: 20}} onClick={() => { setVisiblePartDetail(true); setDealer({dealer, supplier, storage }); }}> 284 <a style={{marginLeft: 20}} onClick={() => { setVisiblePartDetail(true); setDealer({dealer, supplier, storage }); }}>
261 查看配件 285 查看配件
@@ -308,11 +332,40 @@ export default function Index() { @@ -308,11 +332,40 @@ export default function Index() {
308 deletePart={deletePart} 332 deletePart={deletePart}
309 /> 333 />
310 </div> 334 </div>
311 - <StepBnt  
312 - disable={loading}  
313 - bntLoading={loading}  
314 - submit={onSubmit}  
315 - /> 335 + <div style={{display: 'flex', justifyContent: 'center'}}>
  336 + <Popconfirm
  337 + title="确定取消"
  338 + onConfirm={() => history.goBack()}
  339 + okText="确定"
  340 + cancelText="取消"
  341 + >
  342 + <Button
  343 + disabled={loading}
  344 + loading={loading}
  345 + style={{marginRight: 20}}
  346 + >
  347 + 取消
  348 + </Button>
  349 + </Popconfirm>
  350 + <Button
  351 + disabled={loading}
  352 + loading={loading}
  353 + onClick={() => onSubmit(false)}
  354 + type="primary"
  355 + style={{marginRight: 20}}
  356 + >
  357 + 暂存为草稿
  358 + </Button>
  359 + <Button
  360 + disabled={loading}
  361 + loading={loading}
  362 + onClick={() => onSubmit(true)}
  363 + type="primary"
  364 + >
  365 + 确认并提交
  366 + </Button>
  367 + </div>
  368 +
316 </Card> 369 </Card>
317 </ConfigProvider> 370 </ConfigProvider>
318 </PageHeaderWrapper> 371 </PageHeaderWrapper>
src/pages/pms/partPlan/PlanManage/subpages/Detail/api.ts
@@ -7,6 +7,7 @@ import { PMS_HOST } from &#39;@/utils/host&#39;; @@ -7,6 +7,7 @@ import { PMS_HOST } from &#39;@/utils/host&#39;;
7 */ 7 */
8 export interface DetailVO { 8 export interface DetailVO {
9 brandName?: string; // 品牌名称 9 brandName?: string; // 品牌名称
  10 + brandId?: number; // 品牌ID
10 settleDealerName?: string; // 结算商家 11 settleDealerName?: string; // 结算商家
11 settleShopName?: string; // 结算门店 12 settleShopName?: string; // 结算门店
12 suppliers?: SupplierVO[]; // 配件集合 13 suppliers?: SupplierVO[]; // 配件集合