Commit 3fca9d3d5e57c457d59f1732ee3987a60125de1b

Authored by PurelzMgnead
1 parent 77557615

分期订单

Too many changes to show.

To preserve performance only 14 of 15 files are displayed.

.umirc.ts
@@ -59,6 +59,13 @@ export default defineConfig({ @@ -59,6 +59,13 @@ export default defineConfig({
59 access: 'canReadAdminAndFinance', 59 access: 'canReadAdminAndFinance',
60 }, 60 },
61 { 61 {
  62 + name: '分期账单',
  63 + path: '/instalment',
  64 + component: './Instalment',
  65 + icon: 'BookOutlined',
  66 + access: 'canReadAdminAndFinance',
  67 + },
  68 + {
62 name: '打印', 69 name: '打印',
63 path: '/print', 70 path: '/print',
64 component: './OrderPrint', 71 component: './OrderPrint',
src/pages/Instalment/components/detail/detail.tsx 0 → 100644
  1 +import { PlusOutlined } from '@ant-design/icons';
  2 +import {
  3 + ModalForm,
  4 + ProCard,
  5 + ProForm,
  6 + ProFormDatePicker,
  7 + ProFormText,
  8 + ProFormTextArea,
  9 + ProFormUploadButton,
  10 +} from '@ant-design/pro-components';
  11 +import ProductDetail from '../productDetail/productDetail';
  12 +import PayWayDetail from '../payWayDetail/payWayDetail';
  13 +import { Button, Form,message } from 'antd';
  14 +import { useEffect,useState } from 'react';
  15 +import { postOrderErpOrderStagesPayWaySaveOrUpdate, postOrderErpOrderStagesSaveOrUpdate, postOrderErpOrderStagesSearch, postOrderErpOrderStagesUpload } from '@/services';
  16 +import { RcFile } from 'antd/es/upload';
  17 +
  18 +const waitTime = (time: number = 100) => {
  19 + return new Promise((resolve) => {
  20 + setTimeout(() => {
  21 + resolve(true);
  22 + }, time);
  23 + });
  24 +};
  25 +
  26 +export default ({ toReload }) => {
  27 + const [form] = Form.useForm<{ name: string; company: string }>();
  28 + const [contextBody, setContextBody] = useState<OrderStagesWithListItem>({
  29 + id:undefined,
  30 + contract:undefined,
  31 + dateRange:undefined,
  32 + terminal:undefined,
  33 + orderStagesDeviceVoList:[],
  34 + totalPrice:undefined,
  35 + payWay:"30/30/30/10",
  36 + annex:undefined,
  37 + remark:undefined
  38 + });
  39 + const [editProductBody, setEditProductBody] = useState([]);
  40 + const [total, setTotal] = useState(0);
  41 + const [payWayBody, setPayWayBody] = useState([])
  42 + const [otherBody, setOtherBody] = useState([])
  43 + const [isDis,setIsDis]=useState(true)
  44 +
  45 +
  46 + type OrderStagesWithListItem = {
  47 + //文件编号
  48 + id?: number;
  49 + //合同编号
  50 + contract?: string;
  51 + //供应商名称
  52 + vendor?: string;
  53 + //签合同日期
  54 + dateRange?: Date;
  55 + //终端名称
  56 + terminal?: string;
  57 + orderStagesDeviceVoList: orderStagesDevice[]
  58 + //合同总金额
  59 + totalPrice?: number;
  60 + //付款方式
  61 + payWay?: string;
  62 + //附件
  63 + annex?: string;
  64 + //备注
  65 + remark?: string;
  66 + };
  67 +
  68 + type orderStagesDevice = {
  69 + //设备id
  70 + dId: number;
  71 + //设备名称
  72 + deviceName: string;
  73 + //设备型号
  74 + deviceModel: string;
  75 + //数量
  76 + count: number;
  77 + //单价
  78 + unitPrice: number;
  79 + //总价
  80 + price: number;
  81 + }
  82 +
  83 + function getEditProductBody(value) {
  84 + console.log(value);
  85 +
  86 + setEditProductBody(value)
  87 + let price = 0;
  88 + value.map(obj => (
  89 + price += (obj.count * obj.unitPrice)
  90 + ));
  91 + setTotal(price);
  92 + setContextBody({ ...contextBody, orderStagesDeviceVoList: value })
  93 + if (contextBody.payWay==="") {
  94 + handleInputChange("30/30/30/10", 0, price)
  95 + }else{
  96 + handleInputChange(contextBody.payWay, 0, price)
  97 + }
  98 + }
  99 + []
  100 + function setSave(value) {
  101 + console.log(value);
  102 + setOtherBody(value)
  103 + }
  104 +
  105 + useEffect(() => {
  106 + setContextBody({ ...contextBody, totalPrice: total })
  107 + form.setFieldValue('totalPrice', total);
  108 + }, [total])
  109 +
  110 + const handleInputChange = (value: string, no: number, priceNow?: number) => {
  111 + if (value==="") {
  112 + message.info("请输入比例!")
  113 + }else{
  114 + let totalPay = 0;
  115 + const payValue: string[] = value.split("/")
  116 + let body: ((prevState: never[]) => never[]) | { proportion: string; payPrice: number; }[] = [];
  117 + if (no === 1) {
  118 + if (payValue.length !== 4) {
  119 + message.warning('比例个数总和不为4个!');
  120 + } else {
  121 + payValue.forEach((item, index) => {
  122 + totalPay += Number(item)
  123 + })
  124 + }
  125 + if (totalPay != 100) {
  126 + message.warning('比例总和不为100!');
  127 + } else {
  128 + message.success('输入有效!');
  129 + payValue.forEach((item, index) => {
  130 + body.push({ proportion: item + "%", payPrice: Number(item) * total / 100 })
  131 + })
  132 + setPayWayBody(body)
  133 + }
  134 + } else {
  135 + payValue.forEach((item, index) => {
  136 + totalPay += Number(item)
  137 + })
  138 + payValue.forEach((item, index) => {
  139 + body.push({ proportion: item + "%", payPrice: Number(item) * priceNow / 100 })
  140 + })
  141 + setPayWayBody(body)
  142 + }
  143 + }
  144 + };
  145 +
  146 + return (
  147 + <ModalForm<OrderStagesWithListItem>
  148 + title="新建"
  149 + trigger={
  150 + <Button
  151 + key="button"
  152 + icon={<PlusOutlined />}
  153 + type="primary"
  154 + >
  155 + 新增
  156 + </Button>
  157 + }
  158 + form={form}
  159 + autoFocusFirstInput
  160 + modalProps={{
  161 + destroyOnClose: true,
  162 + onCancel: () => console.log('run'),
  163 + }}
  164 + onChange={(value) => {
  165 + console.log(value);
  166 + }}
  167 + submitTimeout={2000}
  168 + onFinish={async (values) => {
  169 + console.log(values);
  170 + console.log(otherBody);
  171 + let remakeValue = [];
  172 + let remakeItem = {}
  173 +
  174 + const formData = new FormData();
  175 + // let toSendEdit={...values,orderStagesDeviceVoList:contextBody.orderStagesDeviceVoList};
  176 + let toSendEdit = {
  177 + id: values.id || contextBody.id,
  178 + contract: values.contract || contextBody.contract,
  179 + vendor: values.vendor || contextBody.vendor,
  180 + dateRange: values.dateRange || contextBody.dateRange,
  181 + terminal: values.terminal || contextBody.terminal,
  182 + orderStagesDeviceDoList: values.orderStagesDeviceVoList || contextBody.orderStagesDeviceVoList,
  183 + totalPrice: values.totalPrice || contextBody.totalPrice,
  184 + payWay: values.payWay || contextBody.payWay,
  185 + annex: contextBody.annex,
  186 + remark: values.remark || contextBody.remark,
  187 + };
  188 + if (values.annex) {
  189 + formData.append('file', values.annex[0].originFileObj as RcFile);
  190 + const res = await postOrderErpOrderStagesUpload({
  191 + data: formData,
  192 + headers: {
  193 + 'Content-Type':
  194 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  195 + }
  196 + });
  197 + if (res.data) {
  198 + console.log(values)
  199 + console.log(contextBody);
  200 + toSendEdit.annex = res.data
  201 + }
  202 + }
  203 + const isSaveOrUpdate = await postOrderErpOrderStagesSaveOrUpdate({
  204 + data: { ...toSendEdit }
  205 + })
  206 +
  207 + if (isSaveOrUpdate) {
  208 + // 创建一个用于存储所有异步操作的Promise数组
  209 + const promises = [];
  210 +
  211 + otherBody.forEach(item => {
  212 + let remakeItem = { ossId: item.ossId, number: item.id, dataRange: item.payDate, fileName: item.fileName };
  213 + if (typeof item.fileUrl === 'object' && item.fileUrl instanceof File) {
  214 + const formData = new FormData();
  215 + formData.append('file', item.fileUrl as RcFile);
  216 + const uploadPromise = async () => {
  217 + const res = await postOrderErpOrderStagesUpload({
  218 + data: formData,
  219 + headers: {
  220 + 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  221 + }
  222 + });
  223 + if (res.data) {
  224 + remakeItem.fileUrl = res.data;
  225 + }
  226 + };
  227 + promises.push(uploadPromise());
  228 + }
  229 + remakeValue.push(remakeItem);
  230 + });
  231 +
  232 + let makeEnd=[]
  233 + const getRetrunIDPromise=async()=>{
  234 + let returnOssID=await postOrderErpOrderStagesSearch({
  235 + data:{contract: values.contract || contextBody.contract,},
  236 + })
  237 + console.log(returnOssID.data);
  238 +
  239 + if (returnOssID) {
  240 + makeEnd = remakeValue.map(item => {
  241 + return { ...item, ossId: returnOssID.data[0].id };
  242 + });
  243 +
  244 + console.log(makeEnd);
  245 + }
  246 + }
  247 +
  248 + promises.push(getRetrunIDPromise());
  249 +
  250 + // 使用Promise.all等待所有异步操作完成后再执行保存操作
  251 + Promise.all(promises).then(
  252 + async () => {
  253 + console.log(makeEnd);
  254 + await postOrderErpOrderStagesPayWaySaveOrUpdate({
  255 + data: makeEnd
  256 + });
  257 + });
  258 + console.log(isSaveOrUpdate);
  259 + toReload()
  260 + }
  261 + await waitTime(2000);
  262 + message.success('提交成功');
  263 + return true;
  264 + }}
  265 + >
  266 + <ProCard
  267 + title="基本信息"
  268 + headerBordered
  269 + bordered
  270 + >
  271 + <ProForm.Group>
  272 + <ProFormText
  273 + width="md"
  274 + name="vendor"
  275 + rules={[{ required: true, message: '此项为必填项' }]}
  276 + label="供应商名称"
  277 + placeholder="请输入"
  278 + initialValue={contextBody.vendor}
  279 + />
  280 +
  281 + <ProFormText
  282 + width="md"
  283 + name="terminal"
  284 + rules={[{ required: true, message: '此项为必填项' }]}
  285 + label="终端名称"
  286 + placeholder="请输入"
  287 + initialValue={contextBody.terminal}
  288 + />
  289 +
  290 + <ProFormDatePicker
  291 + name="dateRange"
  292 + width="md"
  293 + label="签合同日期"
  294 + placeholder="请选择日期"
  295 + fieldProps={{
  296 + format: (value) => value.format('YYYY-MM-DD'),
  297 + }}
  298 + initialValue={contextBody.dateRange}
  299 + />
  300 +
  301 + <ProFormText
  302 + width="md"
  303 + name="payWay"
  304 + rules={[{ required: true, message: '此项为必填项' }]}
  305 + label="付款比例"
  306 + placeholder="请输入"
  307 + initialValue={contextBody.payWay}
  308 + disabled={!isDis}
  309 + // onBlur={(e) => {
  310 + // setContextBody({...contextBody,payWay:e.target.value})
  311 + // handleInputChange(e.target.value, 1);
  312 + // }}
  313 + />
  314 +
  315 + <ProFormText
  316 + width="md"
  317 + name="contract"
  318 + rules={[{ required: true, message: '此项为必填项' }]}
  319 + label="合同编号"
  320 + placeholder="请输入"
  321 + initialValue={contextBody.contract}
  322 + />
  323 +
  324 + <ProFormUploadButton width="md"
  325 + name="annex"
  326 + max={1}
  327 + onChange={(value) => {
  328 + console.log(value);
  329 + }}
  330 + label="合同附件" />
  331 +
  332 + <ProFormText
  333 + width="md"
  334 + name="totalPrice"
  335 + label="合同金额"
  336 + placeholder="请输入"
  337 + // rules={[{ required: true, message: '此项为必填项' }]}
  338 + // value={contextBody.totalPrice}
  339 + // onBlur={(e) => {
  340 + // if (e.target.value !== '0') {
  341 + // setIsDis(false);
  342 + // setTotal(e.target.value);
  343 + // } else {
  344 + // setIsDis(true);
  345 + // }
  346 + // }}
  347 + disabled={isDis}
  348 + initialValue={"0"}
  349 + />
  350 + </ProForm.Group>
  351 + </ProCard>
  352 + <ProCard
  353 + title="产品明细"
  354 + style={{ marginTop: 10 }}
  355 + headerBordered
  356 + bordered
  357 + >
  358 + <ProductDetail productBody={[]} EditProductBody={getEditProductBody}></ProductDetail>
  359 + </ProCard>
  360 +
  361 + <ProCard
  362 + title="付款信息"
  363 + style={{ marginTop: 10 }}
  364 + headerBordered
  365 + bordered
  366 + >
  367 + <PayWayDetail payBody={payWayBody} thisId={null} currtSave={setSave}></PayWayDetail>
  368 + </ProCard>
  369 +
  370 + <ProCard
  371 + style={{ marginTop: 10 }}
  372 + headerBordered
  373 + bordered
  374 + >
  375 + <ProFormTextArea label="备注" name="remark" initialValue={contextBody.remark} />
  376 + </ProCard>
  377 + </ModalForm>
  378 + );
  379 +};
0 \ No newline at end of file 380 \ No newline at end of file
src/pages/Instalment/components/edit/edit.tsx 0 → 100644
  1 +import {
  2 + ModalForm,
  3 + ProCard,
  4 + ProForm,
  5 + ProFormDatePicker,
  6 + ProFormText,
  7 + ProFormTextArea,
  8 + ProFormUploadButton,
  9 +} from '@ant-design/pro-components';
  10 +import ProductDetail from '../productDetail/productDetail';
  11 +import PayWayDetail from '../payWayDetail/payWayDetail';
  12 +import { Form,message } from 'antd';
  13 +import { useEffect, useState } from 'react';
  14 +import { postOrderErpOrderStagesPayWaySaveOrUpdate, postOrderErpOrderStagesSaveOrUpdate, postOrderErpOrderStagesSearch, postOrderErpOrderStagesUpload } from '@/services';
  15 +import { RcFile } from 'antd/es/upload';
  16 +
  17 +const waitTime = (time: number = 100) => {
  18 + return new Promise((resolve) => {
  19 + setTimeout(() => {
  20 + resolve(true);
  21 + }, time);
  22 + });
  23 +};
  24 +
  25 +export default ({ currentContract,toReload }) => {
  26 + const [form] = Form.useForm<{ name: string; company: string }>();
  27 + const [contextBody, setContextBody] = useState({});
  28 + const [editProductBody, setEditProductBody] = useState([]);
  29 + const [total, setTotal] = useState(0);
  30 + const [payWayBody, setPayWayBody] = useState([])
  31 + const [otherBody, setOtherBody] = useState([])
  32 +
  33 + type OrderStagesWithListItem = {
  34 + //文件编号
  35 + id: number;
  36 + //合同编号
  37 + contract: string;
  38 + //供应商名称
  39 + vendor: string;
  40 + //签合同日期
  41 + dateRange: Date;
  42 + //终端名称
  43 + terminal: string;
  44 + orderStagesDeviceVoList: orderStagesDevice[]
  45 + //合同总金额
  46 + totalPrice: number;
  47 + //付款方式
  48 + payWay: string;
  49 + //附件
  50 + annex: string;
  51 + //备注
  52 + remark: string;
  53 + };
  54 +
  55 + type orderStagesDevice = {
  56 + //设备id
  57 + dId: number;
  58 + //设备名称
  59 + deviceName: string;
  60 + //设备型号
  61 + deviceModel: string;
  62 + //数量
  63 + count: number;
  64 + //单价
  65 + unitPrice: number;
  66 + //总价
  67 + price: number;
  68 + }
  69 +
  70 + async function getBody() {
  71 + const res = await postOrderErpOrderStagesSearch({
  72 + data: { contract: currentContract },
  73 + });
  74 + const context = res.data[0];
  75 + console.log(context);
  76 +
  77 + if (context.contract != null) {
  78 + setContextBody(context);
  79 + setTotal(context.totalPrice)
  80 + form.setFieldValue('totalPrice', context.totalPrice);
  81 + }
  82 + handleInputChange(context.payWay, 0, context.totalPrice)
  83 + }
  84 +
  85 + function getEditProductBody(value) {
  86 + console.log(value);
  87 +
  88 + setEditProductBody(value)
  89 + let price = 0;
  90 + value.map(obj => (
  91 + price += (obj.count * obj.unitPrice)
  92 + ));
  93 + setTotal(price);
  94 + setContextBody({ ...contextBody, orderStagesDeviceVoList: value })
  95 + handleInputChange(contextBody.payWay, 0, price)
  96 + }
  97 + []
  98 + function setSave(value) {
  99 + console.log(value);
  100 + setOtherBody(value)
  101 + }
  102 +
  103 + useEffect(() => {
  104 + setContextBody({ ...contextBody, totalPrice: total })
  105 + form.setFieldValue('totalPrice', total);
  106 + }, [total])
  107 +
  108 + useEffect(() => {
  109 + getBody()
  110 + }, [])
  111 +
  112 + const handleInputChange = (value: string, no: number, priceNow?: number) => {
  113 + let totalPay = 0;
  114 + const payValue: string[] = value.split("/")
  115 + let body: ((prevState: never[]) => never[]) | { proportion: string; payPrice: number; }[] = [];
  116 + if (no === 1) {
  117 + if (payValue.length !== 4) {
  118 + message.warning('比例个数总和不为4个!');
  119 + } else {
  120 + payValue.forEach((item, index) => {
  121 + totalPay += Number(item)
  122 + })
  123 + }
  124 + if (totalPay != 100) {
  125 + message.warning('比例总和不为100!');
  126 + } else {
  127 + message.success('输入有效!');
  128 + const price = total
  129 + payValue.forEach((item, index) => {
  130 + body.push({ proportion: item + "%", payPrice: Number(item) * price / 100 })
  131 + })
  132 + setPayWayBody(body)
  133 + }
  134 + } else {
  135 + payValue.forEach((item, index) => {
  136 + totalPay += Number(item)
  137 + })
  138 + payValue.forEach((item, index) => {
  139 + body.push({ proportion: item + "%", payPrice: Number(item) * priceNow / 100 })
  140 + })
  141 + setPayWayBody(body)
  142 + }
  143 + };
  144 +
  145 + return (
  146 + <ModalForm<OrderStagesWithListItem>
  147 + title="新建"
  148 + trigger={
  149 + <a>
  150 + 编辑
  151 + </a>
  152 + }
  153 + form={form}
  154 + autoFocusFirstInput
  155 + modalProps={{
  156 + destroyOnClose: true,
  157 + onCancel: () => console.log('run'),
  158 + }}
  159 + submitTimeout={2000}
  160 + onFinish={async (values) => {
  161 + console.log(values);
  162 + console.log(otherBody);
  163 + let remakeValue = [];
  164 + let remakeItem = {}
  165 + // 创建一个用于存储所有异步操作的Promise数组
  166 + const promises = [];
  167 +
  168 + otherBody.forEach(item => {
  169 + let remakeItem = { ossId: item.ossId, number: item.id, dataRange: item.payDate, fileName: item.fileName };
  170 + if (typeof item.fileUrl === 'object' && item.fileUrl instanceof File) {
  171 + const formData = new FormData();
  172 + formData.append('file', item.fileUrl as RcFile);
  173 + const uploadPromise = async () => {
  174 + const res = await postOrderErpOrderStagesUpload({
  175 + data: formData,
  176 + headers: {
  177 + 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  178 + }
  179 + });
  180 + if (res.data) {
  181 + remakeItem.fileUrl = res.data;
  182 + }
  183 + };
  184 + promises.push(uploadPromise());
  185 + }
  186 + remakeValue.push(remakeItem);
  187 + });
  188 +
  189 + // 使用Promise.all等待所有异步操作完成后再执行保存操作
  190 + Promise.all(promises).then(async () => {
  191 + const resp = await postOrderErpOrderStagesPayWaySaveOrUpdate({
  192 + data: remakeValue
  193 + });
  194 + });
  195 + const formData = new FormData();
  196 + // let toSendEdit={...values,orderStagesDeviceVoList:contextBody.orderStagesDeviceVoList};
  197 + let toSendEdit = {
  198 + id: values.id || contextBody.id,
  199 + contract: values.contract || contextBody.contract,
  200 + vendor: values.vendor || contextBody.vendor,
  201 + dateRange: values.dateRange || contextBody.dateRange,
  202 + terminal: values.terminal || contextBody.terminal,
  203 + orderStagesDeviceDoList: values.orderStagesDeviceVoList || contextBody.orderStagesDeviceVoList,
  204 + totalPrice: values.totalPrice || contextBody.totalPrice,
  205 + payWay: values.payWay || contextBody.payWay,
  206 + annex: contextBody.annex,
  207 + remark: values.remark || contextBody.remark,
  208 + };
  209 + if (values.annex) {
  210 + formData.append('file', values.annex[0].originFileObj as RcFile);
  211 + const res = await postOrderErpOrderStagesUpload({
  212 + data: formData,
  213 + headers: {
  214 + 'Content-Type':
  215 + 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  216 + }
  217 + });
  218 + if (res.data) {
  219 + console.log(values)
  220 + console.log(contextBody);
  221 + toSendEdit.annex = res.data
  222 + }
  223 + }
  224 + const isSaveOrUpdate = await postOrderErpOrderStagesSaveOrUpdate({
  225 + data: { ...toSendEdit }
  226 + })
  227 + if (isSaveOrUpdate) {
  228 + console.log(isSaveOrUpdate);
  229 + getBody()
  230 + toReload()
  231 + }
  232 + await waitTime(2000);
  233 + message.success('提交成功');
  234 + return true;
  235 + }}
  236 + >
  237 + <ProCard
  238 + title="基本信息"
  239 + headerBordered
  240 + bordered
  241 + >
  242 + <ProForm.Group>
  243 + <ProFormText
  244 + width="md"
  245 + name="vendor"
  246 + rules={[{ required: true, message: '此项为必填项' }]}
  247 + label="供应商名称"
  248 + placeholder="请输入"
  249 + initialValue={contextBody.vendor}
  250 + />
  251 +
  252 + <ProFormText
  253 + width="md"
  254 + name="terminal"
  255 + rules={[{ required: true, message: '此项为必填项' }]}
  256 + label="终端名称"
  257 + placeholder="请输入"
  258 + initialValue={contextBody.terminal}
  259 + />
  260 +
  261 + <ProFormDatePicker
  262 + name="dateRange"
  263 + width="md"
  264 + label="签合同日期"
  265 + placeholder="请选择日期"
  266 + fieldProps={{
  267 + format: (value) => value.format('YYYY-MM-DD'),
  268 + }}
  269 + initialValue={contextBody.dateRange}
  270 + />
  271 +
  272 + <ProFormText
  273 + width="md"
  274 + name="payWay"
  275 + rules={[{ required: true, message: '此项为必填项' }]}
  276 + label="付款比例"
  277 + placeholder="请输入"
  278 + initialValue={contextBody.payWay}
  279 + onBlur={(e) => {
  280 + handleInputChange(e.target.value, 1);
  281 + }}
  282 + />
  283 +
  284 + <ProFormText
  285 + width="md"
  286 + name="contract"
  287 + rules={[{ required: true, message: '此项为必填项' }]}
  288 + label="合同编号"
  289 + placeholder="请输入"
  290 + initialValue={contextBody.contract}
  291 + />
  292 +
  293 + <ProFormUploadButton width="md"
  294 + name="annex"
  295 + max={1}
  296 + onChange={(value) => {
  297 + console.log(value);
  298 + }}
  299 + label="合同附件" />
  300 +
  301 + <ProFormText
  302 + width="md"
  303 + name="totalPrice"
  304 + label="合同金额"
  305 + placeholder="请输入"
  306 + disabled
  307 + // rules={[{ required: true, message: '此项为必填项' }]}
  308 + // value={contextBody.totalPrice}
  309 + initialValue={contextBody.totalPrice}
  310 + />
  311 + </ProForm.Group>
  312 + </ProCard>
  313 + <ProCard
  314 + title="产品明细"
  315 + style={{ marginTop: 10 }}
  316 + headerBordered
  317 + bordered
  318 + >
  319 + <ProductDetail productBody={contextBody.orderStagesDeviceVoList} EditProductBody={getEditProductBody}></ProductDetail>
  320 + </ProCard>
  321 +
  322 + <ProCard
  323 + title="付款信息"
  324 + style={{ marginTop: 10 }}
  325 + headerBordered
  326 + bordered
  327 + >
  328 + <PayWayDetail payBody={payWayBody} thisId={contextBody.id} currtSave={setSave}></PayWayDetail>
  329 + </ProCard>
  330 +
  331 + <ProCard
  332 + style={{ marginTop: 10 }}
  333 + headerBordered
  334 + bordered
  335 + >
  336 + <ProFormTextArea label="备注" name="remark" initialValue={contextBody.remark} />
  337 + </ProCard>
  338 + </ModalForm>
  339 + );
  340 +};
0 \ No newline at end of file 341 \ No newline at end of file
src/pages/Instalment/components/payWayDetail/payWayDetail.less 0 → 100644
  1 +.payway-detail-index td{
  2 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  3 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  4 + 'WenQuanYi Micro Hei', sans-serif;
  5 + font-size: 14px;
  6 + margin: 0;
  7 +
  8 + .css-dev-only-do-not-override-nllxry{
  9 + margin-bottom: 0px !important;
  10 + }
  11 + }
  12 +
  13 + .dataChoose{
  14 + margin: 0;
  15 + }
  16 +
  17 + // .pay-way-detail-index td .css-dev-only-do-not-override-nllxry{
  18 + // margin-bottom: 0px !important;
  19 + // }
src/pages/Instalment/components/payWayDetail/payWayDetail.tsx 0 → 100644
  1 +import type { ProColumns } from '@ant-design/pro-components';
  2 +import {
  3 + EditableProTable,
  4 + ProFormDatePicker,
  5 + ProFormRadio,
  6 + ProFormUploadButton,
  7 +} from '@ant-design/pro-components';
  8 +import React, { useEffect, useState } from 'react';
  9 +import './payWayDetail.less'
  10 +import { postOrderErpOrderStagesPayWaySelect } from '@/services';
  11 +import { message } from 'antd';
  12 +
  13 +const waitTime = (time: number = 100) => {
  14 + return new Promise((resolve) => {
  15 + setTimeout(() => {
  16 + resolve(true);
  17 + }, time);
  18 + });
  19 +};
  20 +
  21 +type DataSourceType = {
  22 + id: number;
  23 + payStep?: string;
  24 + proportion?: string;
  25 + ossId?: number,
  26 + payPrice?: number;
  27 + payDate?: Date;
  28 + fileName?: string;
  29 + fileUrl?: string;
  30 +};
  31 +
  32 +export default ({ payBody, thisId, currtSave }) => {
  33 + const defaultData: DataSourceType[] = [
  34 + {
  35 + id: 1,
  36 + payStep: '预付款',
  37 + proportion: undefined,
  38 + payPrice: undefined,
  39 + ossId: undefined,
  40 + payDate: undefined,
  41 + fileName: undefined,
  42 + fileUrl: undefined
  43 + },
  44 + {
  45 + id: 2,
  46 + payStep: '发贷款',
  47 + proportion: undefined,
  48 + payPrice: undefined,
  49 + ossId: undefined,
  50 + payDate: undefined,
  51 + fileName: undefined,
  52 + fileUrl: undefined
  53 + },
  54 + {
  55 + id: 3,
  56 + payStep: '验收款',
  57 + proportion: undefined,
  58 + payPrice: undefined,
  59 + ossId: undefined,
  60 + payDate: undefined,
  61 + fileName: undefined,
  62 + fileUrl: undefined
  63 + },
  64 + {
  65 + id: 4,
  66 + payStep: '质保金',
  67 + proportion: undefined,
  68 + payPrice: undefined,
  69 + ossId: undefined,
  70 + payDate: undefined,
  71 + fileName: undefined,
  72 + fileUrl: undefined
  73 + }
  74 + ];
  75 +
  76 + const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
  77 + const [dataSource, setDataSource] = useState<readonly DataSourceType[]>([]);
  78 + const [position, setPosition] = useState<'top' | 'bottom' | 'hidden'>('hidden',);
  79 + const [payWayDetailBody, setPayWayDetailBody] = useState<readonly DataSourceType[]>([...defaultData])
  80 + const [body, setBody] = useState([])
  81 + const [isAccept, setIsAccept] = useState(null)
  82 + const [isCurrtSave, setIsCurrtSave] = useState(false);
  83 +
  84 + async function getOther(value, arr) {
  85 + console.log(value);
  86 + const res = await postOrderErpOrderStagesPayWaySelect({
  87 + data: { ossId: value }
  88 + });
  89 + if (res.data) {
  90 + const context = res.data;
  91 + const remake = arr.map(obj => {
  92 + let currt = obj;
  93 + context.forEach(object => {
  94 + if (object.number == obj.id) {
  95 + currt = {
  96 + ...obj,
  97 + ossId: object.ossId,
  98 + payDate: object.dateRange,
  99 + fileName: object.fileName,
  100 + fileUrl: object.fileUrl
  101 + };
  102 + return currt;
  103 + }
  104 + });
  105 + console.log(currt);
  106 + return currt;
  107 + });
  108 + console.log(context);
  109 + setPayWayDetailBody(remake);
  110 + }
  111 + }
  112 +
  113 + function setPayWay(value) {
  114 + const remakeData = payWayDetailBody.map(obj => {
  115 + return { ...obj, proportion: value[obj.id - 1]?.proportion, payPrice: value[obj.id - 1]?.payPrice }
  116 + })
  117 + console.log(remakeData);
  118 +
  119 + setPayWayDetailBody(remakeData)
  120 + console.log(thisId);
  121 +
  122 + if (thisId!=null) {
  123 + getOther(thisId, remakeData)
  124 + }
  125 + }
  126 + // useEffect(() => {
  127 + // getOther(thisId)
  128 + // }, [thisId])
  129 +
  130 + useEffect(() => {
  131 + setPayWay(payBody)
  132 + }, [payBody])
  133 +
  134 + function setCurrtSave(value) {
  135 + console.log(value);
  136 + setIsCurrtSave(payWayDetailBody)
  137 + }
  138 +
  139 +
  140 + const columns: ProColumns<DataSourceType>[] = [
  141 + {
  142 + title: '编号',
  143 + dataIndex: 'id',
  144 + hideInTable: true,
  145 + editable: false
  146 + },
  147 + {
  148 + title: '付款信息',
  149 + dataIndex: 'payStep',
  150 + editable: false
  151 + },
  152 + {
  153 + title: '付款比例',
  154 + dataIndex: 'proportion',
  155 + editable: false
  156 + },
  157 + {
  158 + title: '付款金额',
  159 + dataIndex: 'payPrice',
  160 + editable: false
  161 + },
  162 + {
  163 + title: '对应的订单',
  164 + dataIndex: 'ossId',
  165 + editable: false,
  166 + hideInTable: true,
  167 + },
  168 + {
  169 + title: '付款时间',
  170 + dataIndex: 'payDate',
  171 + editable: false,
  172 + render: (text, record, _, action) => {
  173 + const handleChange = (value) => {
  174 + const updatedDataSource = payWayDetailBody.map(item => {
  175 + if (item.id === record.id) {
  176 + return {
  177 + ...item,
  178 + payDate: value
  179 + };
  180 + }
  181 + return item;
  182 + });
  183 + console.log(updatedDataSource);
  184 +
  185 + setPayWayDetailBody(updatedDataSource);
  186 + currtSave(updatedDataSource)
  187 + };
  188 +
  189 + return (
  190 + <ProFormDatePicker
  191 + className='dataChoose'
  192 + initialValue={record.payDate}
  193 + value={record.payDate}
  194 + placeholder={"请填写时间"}
  195 + fieldProps={{
  196 + format: (value) => value.format('YYYY-MM-DD'),
  197 + onChange: handleChange,
  198 + }}
  199 + />
  200 + );
  201 + }
  202 + },
  203 + {
  204 + title: '付款单回执',
  205 + dataIndex: 'fileName',
  206 + render: (text, record, _, action) => {
  207 + if (isAccept !== record.id) {
  208 + if (typeof record.fileUrl === 'object' && record.fileUrl instanceof File) {
  209 + return (<a onClick={() => message.error("请先保存")}>{record.fileName}</a>)
  210 + } else {
  211 + return (<a href={record.fileUrl}>{record.fileName}</a>)
  212 + }
  213 + } else {
  214 + return (
  215 + <ProFormUploadButton
  216 + name={record.id}
  217 + onChange={(value) => {
  218 + console.log(value);
  219 + console.log(payWayDetailBody);
  220 + let remakeBody = [];
  221 + let remakeBodyItem = {};
  222 + payWayDetailBody.forEach(item => {
  223 + if (item.id === record.id) {
  224 + remakeBodyItem = { ...item, fileUrl: value.file.originFileObj, fileName: value.file.name }
  225 + } else {
  226 + remakeBodyItem = { ...item }
  227 + } if (value.fileList.length == 0) {
  228 + remakeBodyItem = { ...item, fileUrl: undefined, fileName: undefined }
  229 + }
  230 + remakeBody.push(remakeBodyItem)
  231 + })
  232 + setPayWayDetailBody(remakeBody)
  233 + currtSave(remakeBody)
  234 + }}
  235 + width="md"
  236 + max={1} />
  237 + )
  238 + }
  239 + },
  240 + },
  241 + {
  242 + title: '操作',
  243 + valueType: 'option',
  244 + width: 200,
  245 + render: (text, record, _, action) => [
  246 + <a
  247 + key="editable"
  248 + onClick={() => {
  249 + if (isAccept !== record.id) {
  250 + setIsAccept(record.id)
  251 + } else {
  252 + setIsAccept(null)
  253 + }
  254 +
  255 + }}
  256 + >
  257 + {(record.fileName !== undefined || record.fileName !== '') ? '重新上传' : '上传回执'}
  258 + </a>
  259 + ],
  260 + },
  261 + ];
  262 +
  263 + return (
  264 + <>
  265 + <EditableProTable<DataSourceType>
  266 + rowKey="id"
  267 + className='payWayDetail-index'
  268 + toolbar={{ style: { display: 'none' } }}
  269 + ghost={true}
  270 + scroll={{
  271 + x: 960,
  272 + }}
  273 + recordCreatorProps={
  274 + position !== 'hidden'
  275 + ? {
  276 + position: position as 'top',
  277 + record: () => ({ id: (Math.random() * 1000000).toFixed(0) }),
  278 + }
  279 + : false
  280 + }
  281 + loading={false}
  282 + toolBarRender={() => [
  283 + <ProFormRadio.Group
  284 + key="render"
  285 + fieldProps={{
  286 + value: position,
  287 + onChange: (e) => setPosition(e.target.value),
  288 + }}
  289 + />,
  290 + ]}
  291 + columns={columns}
  292 + request={payWayDetailBody}
  293 + value={payWayDetailBody}
  294 + onChange={() => {
  295 + setPayWayDetailBody;
  296 + setCurrtSave(payWayDetailBody)
  297 + }}
  298 + editable={{
  299 + type: 'multiple',
  300 + editableKeys,
  301 + onSave: async (rowKey, data, row) => {
  302 + console.log(rowKey, data, row);
  303 + await waitTime(2000);
  304 + },
  305 + onChange: setEditableRowKeys,
  306 + }}
  307 + />
  308 + </>
  309 + );
  310 +};
0 \ No newline at end of file 311 \ No newline at end of file
src/pages/Instalment/components/productDetail/productDetail.css 0 → 100644
  1 +.product-detail-index td {
  2 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial, 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', 'WenQuanYi Micro Hei', sans-serif;
  3 + font-size: 14px;
  4 +}
src/pages/Instalment/components/productDetail/productDetail.less 0 → 100644
  1 +.product-detail-index td {
  2 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  3 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  4 + 'WenQuanYi Micro Hei', sans-serif;
  5 + font-size: 14px;
  6 + }
0 \ No newline at end of file 7 \ No newline at end of file
src/pages/Instalment/components/productDetail/productDetail.tsx 0 → 100644
  1 +import type { ProColumns } from '@ant-design/pro-components';
  2 +import {
  3 + EditableProTable,
  4 + ProCard,
  5 + ProFormField,
  6 + ProFormRadio,
  7 +} from '@ant-design/pro-components';
  8 +import React, { useEffect, useState } from 'react';
  9 +import './productDetail.less'
  10 +import { countBy } from 'lodash';
  11 +
  12 +const waitTime = (time: number = 100) => {
  13 + return new Promise((resolve) => {
  14 + setTimeout(() => {
  15 + resolve(true);
  16 + }, time);
  17 + });
  18 +};
  19 +
  20 +type DataSourceType = {
  21 + count?: number;
  22 + id: React.Key;
  23 + deviceModel?: string;
  24 + deviceName?: string;
  25 + price?: number;
  26 + unitPrice?: number;
  27 +};
  28 +
  29 +const defaultData: DataSourceType[] = [
  30 + // {
  31 + // id:1,
  32 + // deviceName: '高低温试验箱',
  33 + // deviceModel: 'CAN-TES36-0049ST',
  34 + // count: 1,
  35 + // unitPrice: 24500,
  36 + // price: 24500,
  37 + // }
  38 +];
  39 +
  40 +export default ({ productBody, EditProductBody }) => {
  41 + const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
  42 + const [dataSource, setDataSource] = useState<readonly DataSourceType[]>([]);
  43 + const [position, setPosition] = useState<'top' | 'bottom' | 'hidden'>(
  44 + 'bottom',
  45 + );
  46 + function getDataSourece() {
  47 + if (productBody.length!=0) {
  48 + setDataSource(productBody)
  49 + }
  50 + }
  51 + function setEditProductBody(value) {
  52 + console.log(value);
  53 + console.log(dataSource);
  54 +
  55 + const modifiedArray = value.map(obj => {
  56 + if (obj.dId && Number(obj.dId) <= 1000) {
  57 + return {
  58 + ...obj,
  59 + count:obj.count,
  60 + dId: null,
  61 + deviceModel:obj.deviceModel,
  62 + deviceName:obj.deviceName,
  63 + price:obj.price,
  64 + unitPrice:obj.unitPrice
  65 + };
  66 + } else {
  67 + return obj;
  68 + }
  69 + });
  70 + console.log(modifiedArray);
  71 +
  72 + EditProductBody(modifiedArray)
  73 + setDataSource(value)
  74 + }
  75 +
  76 + useEffect(() => {
  77 + getDataSourece()
  78 + }, [productBody])
  79 +
  80 + type DataSourceType = {
  81 + id: React.Key,
  82 + count: number,
  83 + dId?: number,
  84 + deviceModel: string,
  85 + deviceName: string,
  86 + price: number
  87 + unitPrice: number,
  88 + }
  89 +
  90 +
  91 + const columns: ProColumns<DataSourceType>[] = [
  92 + {
  93 + title: '设备编号',
  94 + dataIndex: 'dId',
  95 + hideInTable: true
  96 + },
  97 + {
  98 + title: '设备名称',
  99 + dataIndex: 'deviceName',
  100 + formItemProps: (form, { rowIndex }) => {
  101 + return {
  102 + rules:
  103 + [{ required: true, message: '此项为必填项' }]
  104 + };
  105 + }
  106 + },
  107 + {
  108 + title: '设备型号',
  109 + dataIndex: 'deviceModel',
  110 + width: '15%',
  111 + formItemProps: (form, { rowIndex }) => {
  112 + return {
  113 + rules:
  114 + [{ required: true, message: '此项为必填项' }]
  115 + };
  116 + }
  117 + },
  118 + {
  119 + title: '数量',
  120 + dataIndex: 'count',
  121 + formItemProps: (form, { rowIndex }) => {
  122 + return {
  123 + rules:
  124 + [{ required: true, message: '此项为必填项' }]
  125 + };
  126 + }
  127 + },
  128 + {
  129 + title: '单价',
  130 + dataIndex: 'unitPrice',
  131 + formItemProps: (form, { rowIndex }) => {
  132 + return {
  133 + rules:
  134 + [{ required: true, message: '此项为必填项' }]
  135 + };
  136 + }
  137 + },
  138 + {
  139 + title: '总价',
  140 + dataIndex: 'price',
  141 + formItemProps: (form, { rowIndex }) => {
  142 + return {
  143 + rules:
  144 + [{ required: true, message: '此项为必填项' }]
  145 + };
  146 + }
  147 + },
  148 + {
  149 + title: '操作',
  150 + valueType: 'option',
  151 + width: 200,
  152 + render: (text, record, _, action) => [
  153 + <a
  154 + key="editable"
  155 + onClick={() => {
  156 + if (record.dId) {
  157 + action?.startEditable?.(record.dId);
  158 + }
  159 + }}
  160 + >
  161 + 编辑
  162 + </a>,
  163 + <a
  164 + key="delete"
  165 + onClick={() => {
  166 + setDataSource(dataSource.filter((item) => item.dId !== record.dId));
  167 + }}
  168 + >
  169 + 删除
  170 + </a>,
  171 + ],
  172 + },
  173 + ];
  174 +
  175 + return (
  176 + <>
  177 + <EditableProTable<DataSourceType>
  178 + className='product-detail-index'
  179 + rowKey="dId"
  180 + toolbar={{ style: { display: 'none' } }}
  181 + ghost={true}
  182 + scroll={{
  183 + x: 960,
  184 + }}
  185 + recordCreatorProps={
  186 + position !== 'hidden'
  187 + ? {
  188 + position: position as 'top',
  189 + record: () => ({ dId: (Math.random() * 1000).toFixed(0) }),
  190 + }
  191 + : false
  192 + }
  193 + loading={false}
  194 + toolBarRender={() => [
  195 + <ProFormRadio.Group
  196 + key="render"
  197 + fieldProps={{
  198 + value: position,
  199 + onChange: (e) => setPosition(e.target.value),
  200 + }}
  201 + />,
  202 + ]}
  203 + columns={columns}
  204 + request={dataSource}
  205 + value={dataSource}
  206 + onChange={setEditProductBody}
  207 + editable={{
  208 + type: 'multiple',
  209 + editableKeys,
  210 + onSave: async (rowKey, data, row) => {
  211 + await waitTime(2000);
  212 + },
  213 + onChange: setEditableRowKeys,
  214 + }}
  215 + />
  216 + </>
  217 + );
  218 +};
0 \ No newline at end of file 219 \ No newline at end of file
src/pages/Instalment/components/title/title.less 0 → 100644
  1 +.item {
  2 + background: '#0092ff';
  3 + padding: '8px 0';
  4 + display: flex;
  5 + flex-flow: row nowrap;
  6 + // flex-direction: row;
  7 + // flex-wrap: nowrap;
  8 + align-content: normal;
  9 + align-items: center;
  10 + padding-bottom: 20px;
  11 +}
  12 +
  13 +// .titleSpan{
  14 +// font-weight: bold;
  15 +// width: 100px;
  16 +// }
  17 +
  18 +// .Btn{
  19 +// background: '#0092ff';
  20 +// padding: '8px 0';
  21 +// display: flex;
  22 +// flex-flow: row nowrap;
  23 +// // flex-direction: row;
  24 +// // flex-wrap: nowrap;
  25 +// align-content: normal;
  26 +// align-items: center;
  27 +// padding-bottom: 20px;
  28 +// justify-content: space-between;
  29 +// width: 160px;
  30 +// }
  31 +
  32 +.title-index td {
  33 + font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
  34 + 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
  35 + 'WenQuanYi Micro Hei', sans-serif;
  36 + font-size: 14px;
  37 + }
0 \ No newline at end of file 38 \ No newline at end of file
src/pages/Instalment/components/title/title.tsx 0 → 100644
  1 +import { deleteOrderErpOrderStagesDelect, getOrderErpOrderStagesExport, getOrderErpOrderStagesListAll, postOrderErpOrderStagesSaveOrUpdate, postOrderErpOrderStagesSearch } from '@/services';
  2 +import { EllipsisOutlined, MinusOutlined, PlusOutlined, VerticalAlignBottomOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
  3 +import Icon from '@ant-design/icons/lib/components/AntdIcon';
  4 +import type { ActionType, ProColumns, ProFormInstance } from '@ant-design/pro-components';
  5 +import { ProTable, TableDropdown } from '@ant-design/pro-components';
  6 +import { Button, Dropdown, Modal, Space, Tag, message } from 'antd';
  7 +import { ReactNode, useEffect, useRef, useState } from 'react';
  8 +import { request } from 'umi';
  9 +import AddModel from '../detail/detail';
  10 +import EditorModel from '../edit/edit';
  11 +import UploadModel from '../upload/uploadModel';
  12 +import './title.less'
  13 +export const waitTimePromise = async (time: number = 100) => {
  14 + return new Promise((resolve) => {
  15 + setTimeout(() => {
  16 + resolve(true);
  17 + }, time);
  18 + });
  19 +};
  20 +
  21 +export const waitTime = async (time: number = 100) => {
  22 + await waitTimePromise(time);
  23 +};
  24 +
  25 +type OrderStagesItem = {
  26 + //文件编号
  27 + id?: number;
  28 + //合同编号
  29 + contract?: string;
  30 + //供应商名称
  31 + vendor?: string;
  32 + //签合同日期
  33 + dateRange?: Date;
  34 + //终端名称
  35 + terminal?: string;
  36 + //设备名称
  37 + deviceName?: string;
  38 + //设备型号
  39 + deviceModel?: string;
  40 + //数量
  41 + count?: number;
  42 + //单价
  43 + unitPrice?: number;
  44 + //总价
  45 + price?: number;
  46 + //合同总金额
  47 + totalPrice?: number;
  48 + //付款方式
  49 + payWay?: string;
  50 + //附件
  51 + annex?: string;
  52 + //备注
  53 + remark?: string;
  54 +};
  55 +
  56 +type OrderStagesWithListItem = {
  57 + //文件编号
  58 + id: number;
  59 + //合同编号
  60 + contract: string;
  61 + //供应商名称
  62 + vendor: string;
  63 + //签合同日期
  64 + dateRange: Date;
  65 + //终端名称
  66 + terminal: string;
  67 + orderStagesDeviceVoList: orderStagesDevice[]
  68 + //合同总金额
  69 + totalPrice: number;
  70 + //付款方式
  71 + payWay: string;
  72 + //附件
  73 + annex: string;
  74 + //备注
  75 + remark: string;
  76 +};
  77 +
  78 +type orderStagesDevice = {
  79 + //设备id
  80 + dId: number;
  81 + //设备名称
  82 + deviceName: string;
  83 + //设备型号
  84 + deviceModel: string;
  85 + //数量
  86 + count: number;
  87 + //单价
  88 + unitPrice: number;
  89 + //总价
  90 + price: number;
  91 +}
  92 +
  93 +export default () => {
  94 + const actionRef = useRef<ActionType>();
  95 + const [TableItem, setTableItem] = useState([]);
  96 + const [modal1Open, setModal1Open] = useState(false);
  97 + // const [currentContract, setCurrentContract] = useState('');
  98 +
  99 + // const getContract=(contract:string)=>{
  100 + // setCurrentContract(contract)
  101 + // }
  102 +
  103 + interface ActionType {
  104 + reload: (resetPageIndex?: boolean) => void;
  105 + reloadAndRest: () => void;
  106 + reset: () => void;
  107 + clearSelected?: () => void;
  108 + startEditable: (rowKey: Key) => boolean;
  109 + cancelEditable: (rowKey: Key) => boolean;
  110 + }
  111 +
  112 + const ref = useRef<ActionType>(
  113 + {
  114 + reload: (resetPageIndex?: boolean) => {
  115 + // implementation for reload
  116 + },
  117 + reloadAndRest: () => {
  118 + // implementation for reloadAndRest
  119 + },
  120 + reset: () => {
  121 + // implementation for reset
  122 + },
  123 + startEditable: (rowKey: Key) => {
  124 + // implementation for startEditable
  125 + },
  126 + cancelEditable: (rowKey: Key) => {
  127 + // implementation for cancelEditable
  128 + },
  129 + }
  130 + );
  131 +
  132 + function reload() {
  133 + ref.current.reload();
  134 + }
  135 +
  136 + async function toDelete(value) {
  137 + const res = await deleteOrderErpOrderStagesDelect({
  138 + data: {
  139 + ids: value,
  140 + deviceIds: null
  141 + }
  142 + })
  143 + if (res) {
  144 + message.success("删除成功")
  145 + ref.current.reload()
  146 + } else {
  147 + message.error("删除失败")
  148 + }
  149 + }
  150 +
  151 + async function toExport() {
  152 + await getOrderErpOrderStagesExport()
  153 + }
  154 +
  155 +
  156 + const columns: ProColumns<OrderStagesItem>[] = [
  157 + {
  158 + title: '文件编号',
  159 + dataIndex: 'id',
  160 + width: '5%',
  161 + render: (_, record) => {
  162 + if (record.id) {
  163 + const text = record.id.toString();
  164 + const paddedText = '0'.repeat(4 - text.length) + text;
  165 + return paddedText;
  166 + }
  167 + },
  168 + },
  169 + {
  170 + title: '签合同日期',
  171 + dataIndex: 'dateRange',
  172 + valueType: 'date',
  173 + filters: true,
  174 + onFilter: true,
  175 + ellipsis: true,
  176 + width: '6%'
  177 + },
  178 + {
  179 + disable: true,
  180 + title: '合同编号',
  181 + dataIndex: 'contract',
  182 + filters: true,
  183 + onFilter: true,
  184 + ellipsis: true,
  185 + width: '9%'
  186 + },
  187 + {
  188 + disable: true,
  189 + title: '供应商名称',
  190 + dataIndex: 'vendor',
  191 + filters: true,
  192 + onFilter: true,
  193 + ellipsis: true,
  194 + },
  195 + {
  196 + disable: true,
  197 + title: '终端名称',
  198 + dataIndex: 'terminal',
  199 + filters: true,
  200 + onFilter: true,
  201 + ellipsis: true,
  202 + width: '6%'
  203 + },
  204 + {
  205 + disable: true,
  206 + title: '设备名称',
  207 + dataIndex: 'deviceName',
  208 + filters: true,
  209 + onFilter: true,
  210 + ellipsis: true,
  211 + },
  212 + {
  213 + disable: true,
  214 + title: '设备型号',
  215 + dataIndex: 'deviceModel',
  216 + filters: true,
  217 + hideInSearch: true,
  218 + onFilter: false,
  219 + ellipsis: true,
  220 + width: '10%'
  221 + },
  222 + {
  223 + disable: true,
  224 + title: '数量',
  225 + dataIndex: 'count',
  226 + filters: true,
  227 + hideInSearch: true,
  228 + onFilter: false,
  229 + ellipsis: true,
  230 + width: '4%'
  231 + },
  232 + {
  233 + disable: true,
  234 + title: '单价',
  235 + dataIndex: 'unitPrice',
  236 + filters: true,
  237 + hideInSearch: true,
  238 + onFilter: false,
  239 + ellipsis: true,
  240 + width: '5%'
  241 + },
  242 + {
  243 + disable: true,
  244 + title: '总价',
  245 + dataIndex: 'price',
  246 + filters: true,
  247 + hideInSearch: true,
  248 + onFilter: false,
  249 + ellipsis: true,
  250 + width: '5%'
  251 + },
  252 + {
  253 + disable: true,
  254 + title: '合同总金额',
  255 + dataIndex: 'totalPrice',
  256 + filters: true,
  257 + hideInSearch: true,
  258 + onFilter: false,
  259 + ellipsis: true,
  260 + width: '6%'
  261 + },
  262 + {
  263 + disable: true,
  264 + title: '付款方式',
  265 + dataIndex: 'payWay',
  266 + filters: true,
  267 + hideInSearch: true,
  268 + onFilter: false,
  269 + ellipsis: true,
  270 + },
  271 + {
  272 + disable: true,
  273 + title: '附件',
  274 + dataIndex: 'annex',
  275 + filters: true,
  276 + hideInSearch: true,
  277 + onFilter: false,
  278 + ellipsis: true,
  279 + width: '5%',
  280 + render: (_, record) => {
  281 + if (record.id) {
  282 + return <a href={record.annex}>{record.annex}</a>;
  283 + }
  284 + },
  285 + },
  286 + {
  287 + disable: true,
  288 + title: '备注',
  289 + dataIndex: 'remark',
  290 + filters: true,
  291 + hideInSearch: true,
  292 + onFilter: false,
  293 + ellipsis: true,
  294 + width: '5%',
  295 + },
  296 + {
  297 + title: '操作',
  298 + valueType: 'option',
  299 + key: 'option',
  300 + width: '10%',
  301 + render: (text, record, _, action) => {
  302 + if (record?.id) {
  303 + return (
  304 + <>
  305 + <a href={record.annex} target="_blank" rel="noopener noreferrer" key="view">
  306 + 查看
  307 + </a>
  308 + &nbsp;
  309 + <EditorModel currentContract={record.contract} toReload={reload}></EditorModel>
  310 + &nbsp;
  311 + <a key="delect" target="_blank" rel="noopener noreferrer" onClick={() => { toDelete([record.id]) }}>
  312 + 删除
  313 + </a>
  314 + </>
  315 + )
  316 +
  317 + }
  318 + return null;
  319 + },
  320 + },
  321 + ];
  322 +
  323 + return (
  324 + <ProTable<OrderStagesItem>
  325 + className='title-index'
  326 + columnEmptyText=''
  327 + columns={columns}
  328 + actionRef={ref}
  329 + cardBordered
  330 + request={async (params, sort, filter) => {
  331 + console.log(params);
  332 + if (params.id != null || params.contract != null || params.vendor != null || params.terminal != null || params.deviceName != null || params.dateRange != null) {
  333 + console.log(params.id);
  334 + console.log(params.contract);
  335 + console.log(params.vendor);
  336 + let PostOrderErpOrderStagesSearchOption = {
  337 + id: params.id,
  338 + contract: params.contract,
  339 + vendor: params.vendor,
  340 + terminal: params.terminal,
  341 + deviceName: params.deviceName,
  342 + dateRange: params.dateRange
  343 + }
  344 + let res = await postOrderErpOrderStagesSearch({
  345 + data: { ...PostOrderErpOrderStagesSearchOption }
  346 + })
  347 + await waitTime(2000);
  348 + if (res) {
  349 + setTableItem(res.data)
  350 + const orderStagesWithList: OrderStagesWithListItem[] = res?.data
  351 + let orderStagesList: OrderStagesItem[] = []
  352 + for (let ind = 0; ind < orderStagesWithList.length; ind++) {
  353 + for (let index = 0; index < orderStagesWithList[ind].orderStagesDeviceVoList.length; index++) {
  354 + let item: OrderStagesItem = {
  355 + id: undefined,
  356 + contract: undefined,
  357 + vendor: undefined,
  358 + dateRange: undefined,
  359 + terminal: undefined,
  360 + deviceName: undefined,
  361 + deviceModel: undefined,
  362 + count: undefined,
  363 + unitPrice: undefined,
  364 + price: undefined,
  365 + totalPrice: undefined,
  366 + payWay: undefined,
  367 + annex: undefined,
  368 + remark: undefined
  369 + };
  370 + if (index == 0) {
  371 + orderStagesWithList[ind].orderStagesDeviceVoList[index];
  372 + item.id = orderStagesWithList[ind].id;
  373 + item.contract = orderStagesWithList[ind].contract;
  374 + item.vendor = orderStagesWithList[ind].vendor;
  375 + item.dateRange = orderStagesWithList[ind].dateRange;
  376 + item.terminal = orderStagesWithList[ind].terminal;
  377 + item.deviceName = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceName;
  378 + item.deviceModel = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceModel;
  379 + item.count = orderStagesWithList[ind].orderStagesDeviceVoList[index].count;
  380 + item.unitPrice = orderStagesWithList[ind].orderStagesDeviceVoList[index].unitPrice;
  381 + item.price = orderStagesWithList[ind].orderStagesDeviceVoList[index].price;
  382 + item.totalPrice = orderStagesWithList[ind].totalPrice;
  383 + item.payWay = orderStagesWithList[ind].payWay;
  384 + item.annex = orderStagesWithList[ind].annex;
  385 + item.remark = orderStagesWithList[ind].remark;
  386 + orderStagesList.push(item);
  387 + } else {
  388 + item.deviceName = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceName;
  389 + item.deviceModel = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceModel;
  390 + item.count = orderStagesWithList[ind].orderStagesDeviceVoList[index].count;
  391 + item.unitPrice = orderStagesWithList[ind].orderStagesDeviceVoList[index].unitPrice;
  392 + item.price = orderStagesWithList[ind].orderStagesDeviceVoList[index].price;
  393 + orderStagesList.push(item);
  394 + }
  395 + }
  396 + }
  397 + return {
  398 + data: orderStagesList || []
  399 + }
  400 + }
  401 + } else {
  402 + let res = await getOrderErpOrderStagesListAll();
  403 + await waitTime(2000);
  404 + if (res) {
  405 + setTableItem(res.data)
  406 + const orderStagesWithList: OrderStagesWithListItem[] = res?.data
  407 + let orderStagesList: OrderStagesItem[] = []
  408 + for (let ind = 0; ind < orderStagesWithList.length; ind++) {
  409 + for (let index = 0; index < orderStagesWithList[ind].orderStagesDeviceVoList.length; index++) {
  410 + let item: OrderStagesItem = {
  411 + id: undefined,
  412 + contract: undefined,
  413 + vendor: undefined,
  414 + dateRange: undefined,
  415 + terminal: undefined,
  416 + deviceName: undefined,
  417 + deviceModel: undefined,
  418 + count: undefined,
  419 + unitPrice: undefined,
  420 + price: undefined,
  421 + totalPrice: undefined,
  422 + payWay: undefined,
  423 + annex: undefined,
  424 + remark: undefined
  425 + };
  426 + if (index == 0) {
  427 + orderStagesWithList[ind].orderStagesDeviceVoList[index];
  428 + item.id = orderStagesWithList[ind].id;
  429 + item.contract = orderStagesWithList[ind].contract;
  430 + item.vendor = orderStagesWithList[ind].vendor;
  431 + item.dateRange = orderStagesWithList[ind].dateRange;
  432 + item.terminal = orderStagesWithList[ind].terminal;
  433 + item.deviceName = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceName;
  434 + item.deviceModel = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceModel;
  435 + item.count = orderStagesWithList[ind].orderStagesDeviceVoList[index].count;
  436 + item.unitPrice = orderStagesWithList[ind].orderStagesDeviceVoList[index].unitPrice;
  437 + item.price = orderStagesWithList[ind].orderStagesDeviceVoList[index].price;
  438 + item.totalPrice = orderStagesWithList[ind].totalPrice;
  439 + item.payWay = orderStagesWithList[ind].payWay;
  440 + item.annex = orderStagesWithList[ind].annex;
  441 + item.remark = orderStagesWithList[ind].remark;
  442 + orderStagesList.push(item);
  443 + } else {
  444 + item.deviceName = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceName;
  445 + item.deviceModel = orderStagesWithList[ind].orderStagesDeviceVoList[index].deviceModel;
  446 + item.count = orderStagesWithList[ind].orderStagesDeviceVoList[index].count;
  447 + item.unitPrice = orderStagesWithList[ind].orderStagesDeviceVoList[index].unitPrice;
  448 + item.price = orderStagesWithList[ind].orderStagesDeviceVoList[index].price;
  449 + orderStagesList.push(item);
  450 + }
  451 + }
  452 + }
  453 + return {
  454 + data: orderStagesList || []
  455 + }
  456 + }
  457 + }
  458 + }}
  459 + editable={{
  460 + type: 'multiple',
  461 + }}
  462 + columnsState={{
  463 + persistenceKey: 'pro-table-singe-demos',
  464 + persistenceType: 'localStorage',
  465 + defaultValue: {
  466 + option: { fixed: 'right', disable: true },
  467 + },
  468 + onChange(value) {
  469 + console.log('value: ', value);
  470 + },
  471 + }}
  472 + rowKey="id"
  473 + search={{
  474 + labelWidth: 'auto',
  475 + }}
  476 + options={{
  477 + setting: {
  478 + listsHeight: 800,
  479 + },
  480 + }}
  481 + form={{
  482 + // 由于配置了 transform,提交的参与与定义的不同这里需要转化一下
  483 + syncToUrl: (values, type) => {
  484 + if (type === 'get') {
  485 + return {
  486 + ...values,
  487 + created_at: [values.startTime, values.endTime],
  488 + };
  489 + }
  490 + return values;
  491 + },
  492 + }}
  493 + pagination={{
  494 + pageSize: 10,
  495 + onChange: (page) => console.log(page),
  496 + }}
  497 + dateFormatter="string"
  498 + headerTitle={[
  499 +
  500 + ]}
  501 + toolBarRender={() => [
  502 + <>
  503 + <AddModel toReload={reload}></AddModel>
  504 + <UploadModel toReload={reload}></UploadModel>
  505 + {/* <Button type="primary" onClick={()=>{toExport()}}>
  506 + <VerticalAlignTopOutlined />
  507 + 导出
  508 + </Button> */}
  509 + </>
  510 + ]}
  511 + />
  512 + );
  513 +};
0 \ No newline at end of file 514 \ No newline at end of file
src/pages/Instalment/components/upload/uploadApp.tsx 0 → 100644
  1 +import React from 'react';
  2 +import { Upload, message } from 'antd';
  3 +import { InboxOutlined } from '@ant-design/icons';
  4 +
  5 +const App: React.FC = ({ uploadFile }) => {
  6 + const { Dragger } = Upload;
  7 +
  8 + const props = {
  9 + name: 'file',
  10 + multiple: true,
  11 + maxCount: 1,
  12 + onChange:(info)=> {
  13 + console.log(info.file.originFileObj);
  14 + uploadFile(info.file.originFileObj)
  15 + },
  16 + onDrop(e) {
  17 + console.log('Dropped files', e.dataTransfer.files);
  18 + },
  19 + };
  20 +
  21 + return (
  22 + <Dragger {...props}>
  23 + <p className="ant-upload-drag-icon">
  24 + <InboxOutlined />
  25 + </p>
  26 + <p className="ant-upload-text">Click or drag file to this area to upload</p>
  27 + <p className="ant-upload-hint">
  28 + Support for a single or bulk upload. Strictly prohibited from uploading company data or other
  29 + banned files.
  30 + </p>
  31 + </Dragger>
  32 + );
  33 +};
  34 +
  35 +export default App;
0 \ No newline at end of file 36 \ No newline at end of file
src/pages/Instalment/components/upload/uploadModel.tsx 0 → 100644
  1 +import { PlusOutlined, VerticalAlignBottomOutlined } from '@ant-design/icons';
  2 +import {
  3 + ModalForm,
  4 + ProForm,
  5 + ProFormDateRangePicker,
  6 + ProFormSelect,
  7 + ProFormText,
  8 +} from '@ant-design/pro-components';
  9 +import { Button, Form, message } from 'antd';
  10 +import App from './uploadApp'
  11 +import { useState } from 'react';
  12 +import { postOrderErpOrderStagesImport } from '@/services/request';
  13 +import { RcFile } from 'antd/es/upload';
  14 +
  15 +const waitTime = (time: number = 100) => {
  16 + return new Promise((resolve) => {
  17 + setTimeout(() => {
  18 + resolve(true);
  19 + }, time);
  20 + });
  21 +};
  22 +
  23 +export default ({toReload}) => {
  24 + const [form] = Form.useForm<{ name: string; company: string }>();
  25 + const [uploadFile, setUploadFile] = useState({})
  26 + function setUploadFileWay(value) {
  27 + console.log(value);
  28 + setUploadFile(value)
  29 + }
  30 + return (
  31 + <ModalForm<{
  32 + name: string;
  33 + company: string;
  34 + }>
  35 + title="新建表单"
  36 + trigger={
  37 + <Button type="primary">
  38 + <VerticalAlignBottomOutlined />
  39 + 导入
  40 + </Button>
  41 + }
  42 + form={form}
  43 + autoFocusFirstInput
  44 + modalProps={{
  45 + destroyOnClose: true,
  46 + onCancel: () => console.log('run'),
  47 + }}
  48 + submitTimeout={2000}
  49 + onFinish={async (values) => {
  50 + const formData = new FormData();
  51 + formData.append('file', uploadFile as RcFile);
  52 + const res = await postOrderErpOrderStagesImport({
  53 + data: formData,
  54 + headers: {
  55 + 'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq',
  56 + }
  57 + });
  58 + if (res) {
  59 + message.success('提交成功');
  60 + toReload()
  61 + return true;
  62 + }
  63 + }}
  64 + >
  65 + <App uploadFile={setUploadFile}></App>
  66 + </ModalForm>
  67 + );
  68 +};
0 \ No newline at end of file 69 \ No newline at end of file
src/pages/Instalment/index.tsx 0 → 100644
  1 +import Title from './components/title/title';
  2 +
  3 +const instalment_contect: React.FC = () => (
  4 + <>
  5 + <Title />
  6 + </>
  7 +);
  8 +
  9 +export default instalment_contect;
0 \ No newline at end of file 10 \ No newline at end of file
src/services/definition.ts
@@ -347,6 +347,148 @@ export interface ApiApplyAfterSalesRequest { @@ -347,6 +347,148 @@ export interface ApiApplyAfterSalesRequest {
347 uid?: number; 347 uid?: number;
348 } 348 }
349 349
  350 +export interface ApiCreateOrderRequest {
  351 + /**
  352 + * @description
  353 + * 收货人联系方式
  354 + */
  355 + customerContactNumber?: string;
  356 + /**
  357 + * @description
  358 + * 收货人
  359 + */
  360 + customerName?: string;
  361 + /**
  362 + * @description
  363 + * 收货地址
  364 + */
  365 + customerShippingAddress?: string;
  366 + /**
  367 + * @description
  368 + * 单位
  369 + */
  370 + institution?: string;
  371 + /**
  372 + * @description
  373 + * 课题组老师
  374 + */
  375 + institutionContactName?: string;
  376 + /**
  377 + * @description
  378 + * 商品列表
  379 + */
  380 + list?: Array<ApiCreateProductRequest>;
  381 + /**
  382 + * @description
  383 + * 备注
  384 + */
  385 + notes?: string;
  386 + /**
  387 + * @description
  388 + * 支付渠道
  389 + */
  390 + paymentChannel?: string;
  391 + /**
  392 + * @description
  393 + * 支付方式
  394 + */
  395 + paymentMethod?: string;
  396 + /**
  397 + * @description
  398 + * 运费
  399 + */
  400 + shippingFee?: number;
  401 + /**
  402 + * @description
  403 + * 支付总额
  404 + * @example
  405 + * 2343
  406 + */
  407 + totalPayment?: number;
  408 + /**
  409 + * @description
  410 + * 用户id
  411 + * @format int32
  412 + */
  413 + uid?: number;
  414 +}
  415 +
  416 +export interface ApiCreateProductRequest {
  417 + /**
  418 + * @description
  419 + * 规格id
  420 + * @format int32
  421 + */
  422 + attrId?: number;
  423 + /**
  424 + * @description
  425 + * 商品封面图
  426 + */
  427 + image?: string;
  428 + /**
  429 + * @description
  430 + * 备注
  431 + */
  432 + notes?: string;
  433 + /**
  434 + * @description
  435 + * 商品参数
  436 + */
  437 + parameters?: string;
  438 + /**
  439 + * @description
  440 + * 商品编码
  441 + */
  442 + productCode?: string;
  443 + /**
  444 + * @description
  445 + * 商品id
  446 + * @format int32
  447 + */
  448 + productId?: number;
  449 + /**
  450 + * @description
  451 + * 商品名称
  452 + */
  453 + productName?: string;
  454 + /**
  455 + * @description
  456 + * 商品单价
  457 + * @example
  458 + * 2343
  459 + */
  460 + productPrice?: number;
  461 + /**
  462 + * @description
  463 + * 商品数量
  464 + * @format int32
  465 + */
  466 + quantity?: number;
  467 + /**
  468 + * @description
  469 + * 子订单总价格
  470 + */
  471 + subOrderPayment?: number;
  472 + /**
  473 + * @description
  474 + * 商品单位
  475 + */
  476 + unit?: string;
  477 +}
  478 +
  479 +export interface ApiOrderCustomersRequest {
  480 + /** @format int32 */
  481 + current?: number;
  482 + /** @format int32 */
  483 + pageSize?: number;
  484 + /** @format int32 */
  485 + total?: number;
  486 +}
  487 +
  488 +export interface ApiOrderEvaluatedRequest {
  489 + subOrderIds?: Array<number>;
  490 +}
  491 +
350 export interface ApiQueryOrderDetailRequest { 492 export interface ApiQueryOrderDetailRequest {
351 /** 493 /**
352 * @description 494 * @description
@@ -360,6 +502,12 @@ export interface ApiQueryOrderDetailRequest { @@ -360,6 +502,12 @@ export interface ApiQueryOrderDetailRequest {
360 orderId?: string; 502 orderId?: string;
361 /** 503 /**
362 * @description 504 * @description
  505 + * 子订单状态
  506 + * @format int32
  507 + */
  508 + orderStatus?: number;
  509 + /**
  510 + * @description
363 * 账号id 511 * 账号id
364 * @format int32 512 * @format int32
365 */ 513 */
@@ -381,6 +529,12 @@ export interface ApiQueryOrderStatusCountsRequest { @@ -381,6 +529,12 @@ export interface ApiQueryOrderStatusCountsRequest {
381 } 529 }
382 530
383 export interface AuditDto { 531 export interface AuditDto {
  532 + /**
  533 + * @description
  534 + * 主订单id
  535 + * @format int64
  536 + */
  537 + mainOrderId?: number;
384 notes?: string; 538 notes?: string;
385 /** 539 /**
386 * @description 540 * @description
@@ -728,6 +882,8 @@ export interface FilePathDto { @@ -728,6 +882,8 @@ export interface FilePathDto {
728 url?: string; 882 url?: string;
729 } 883 }
730 884
  885 +export type InputStream = any;
  886 +
731 export interface InventoryMaterialStockReq { 887 export interface InventoryMaterialStockReq {
732 auxPropId?: string; 888 auxPropId?: string;
733 isShowStockPosition?: boolean; 889 isShowStockPosition?: boolean;
@@ -735,6 +891,93 @@ export interface InventoryMaterialStockReq { @@ -735,6 +891,93 @@ export interface InventoryMaterialStockReq {
735 materialId?: string; 891 materialId?: string;
736 } 892 }
737 893
  894 +export interface InvoiceDto {
  895 + /**
  896 + * @description
  897 + * 收款时间
  898 + * @format date-time
  899 + */
  900 + collectionTime?: string;
  901 + /**
  902 + * @description
  903 + * 联系人
  904 + */
  905 + contacts?: string;
  906 + /**
  907 + * @description
  908 + * id
  909 + * @format int64
  910 + */
  911 + id?: number;
  912 + /**
  913 + * @description
  914 + * 发票号码
  915 + */
  916 + invoiceNumber?: string;
  917 + /**
  918 + * @description
  919 + * 发票类型
  920 + */
  921 + invoiceStatus?: string;
  922 + /**
  923 + * @description
  924 + * 开票日期
  925 + * @format date-time
  926 + */
  927 + invoicingTime?: string;
  928 + /**
  929 + * @description
  930 + * 关联主订单id
  931 + */
  932 + mainOrderIds?: Array<number>;
  933 + /**
  934 + * @description
  935 + * 金额
  936 + */
  937 + money?: number;
  938 + /**
  939 + * @description
  940 + * 备注
  941 + */
  942 + notes?: string;
  943 + /**
  944 + * @description
  945 + * 收款单位
  946 + */
  947 + payee?: string;
  948 + /**
  949 + * @description
  950 + * 购买方
  951 + */
  952 + purchaser?: string;
  953 + /**
  954 + * @description
  955 + * 销售
  956 + */
  957 + sale?: string;
  958 + /**
  959 + * @description
  960 + * 状态
  961 + */
  962 + status?: string;
  963 +}
  964 +
  965 +export interface InvoiceRecordQueryRequest {
  966 + /** @format date */
  967 + createTimeGe?: string;
  968 + /** @format date */
  969 + createTimeLe?: string;
  970 + /** @format int32 */
  971 + pageNumber?: number;
  972 + /** @format int32 */
  973 + pageSize?: number;
  974 + /**
  975 + * @description
  976 + * 用户id
  977 + */
  978 + uid?: string;
  979 +}
  980 +
738 export interface Item { 981 export interface Item {
739 billDate?: string; 982 billDate?: string;
740 billNo?: string; 983 billNo?: string;
@@ -748,6 +991,20 @@ export interface ItemSaItem { @@ -748,6 +991,20 @@ export interface ItemSaItem {
748 itemValue?: string; 991 itemValue?: string;
749 } 992 }
750 993
  994 +export interface MainOrderqueryRequest {
  995 + afterInvoicingStatusIsNull?: boolean;
  996 + orderStatusNotIn?: Array<string>;
  997 + /** @format int32 */
  998 + pageNumber?: number;
  999 + /** @format int32 */
  1000 + pageSize?: number;
  1001 + /**
  1002 + * @description
  1003 + * 用户id
  1004 + */
  1005 + uid?: string;
  1006 +}
  1007 +
751 export interface MaterialListReply { 1008 export interface MaterialListReply {
752 count?: string; 1009 count?: string;
753 /** @format int32 */ 1010 /** @format int32 */
@@ -1154,6 +1411,93 @@ export interface OrderProfitAnalysisVo { @@ -1154,6 +1411,93 @@ export interface OrderProfitAnalysisVo {
1154 orderIds?: Array<number>; 1411 orderIds?: Array<number>;
1155 } 1412 }
1156 1413
  1414 +export interface OrderStageFileDo {
  1415 + file?: File;
  1416 +}
  1417 +
  1418 +export interface OrderStagesDelDo {
  1419 + deviceIds?: Array<number>;
  1420 + ids?: Array<number>;
  1421 +}
  1422 +
  1423 +export interface OrderStagesDeviceDo {
  1424 + /** @format int32 */
  1425 + count?: number;
  1426 + createByName?: string;
  1427 + /** @format date-time */
  1428 + createTime?: string;
  1429 + deviceModel?: string;
  1430 + deviceName?: string;
  1431 + /** @format int32 */
  1432 + did?: number;
  1433 + logicDelete?: boolean;
  1434 + /** @format double */
  1435 + price?: number;
  1436 + /** @format double */
  1437 + unitPrice?: number;
  1438 + updateByName?: string;
  1439 + /** @format date-time */
  1440 + updateTime?: string;
  1441 +}
  1442 +
  1443 +export interface OrderStagesFromDo {
  1444 + annex?: string;
  1445 + contract?: string;
  1446 + createByName?: string;
  1447 + /** @format date-time */
  1448 + createTime?: string;
  1449 + /** @format date-time */
  1450 + dateRange?: string;
  1451 + /** @format int32 */
  1452 + id?: number;
  1453 + logicDelete?: boolean;
  1454 + orderStagesDeviceDoList?: Array<OrderStagesDeviceDo>;
  1455 + payWay?: string;
  1456 + remark?: string;
  1457 + terminal?: string;
  1458 + /** @format double */
  1459 + totalPrice?: number;
  1460 + updateByName?: string;
  1461 + /** @format date-time */
  1462 + updateTime?: string;
  1463 + vendor?: string;
  1464 + /** @format int32 */
  1465 + version?: number;
  1466 +}
  1467 +
  1468 +export interface OrderStagesPayWay {
  1469 + /** @format date-time */
  1470 + dateRange?: string;
  1471 + fileName?: string;
  1472 + fileUrl?: string;
  1473 + /** @format int32 */
  1474 + id?: number;
  1475 + /** @format int32 */
  1476 + number?: number;
  1477 + /** @format int32 */
  1478 + ossId?: number;
  1479 +}
  1480 +
  1481 +export interface OrderStagesPayWayDo {
  1482 + /** @format int32 */
  1483 + ossId?: number;
  1484 +}
  1485 +
  1486 +export interface OrderStagesPayWayFileDo {
  1487 + fileList?: Array<OrderStageFileDo>;
  1488 +}
  1489 +
  1490 +export interface OrderStagesSelDo {
  1491 + contract?: string;
  1492 + /** @format date-time */
  1493 + dateRange?: string;
  1494 + deviceName?: string;
  1495 + /** @format int64 */
  1496 + id?: number;
  1497 + terminal?: string;
  1498 + vendor?: string;
  1499 +}
  1500 +
1157 export interface OrderTrackStageFieldVO { 1501 export interface OrderTrackStageFieldVO {
1158 aitexTestFinishResult?: string; 1502 aitexTestFinishResult?: string;
1159 aitexTestSendTime?: string; 1503 aitexTestSendTime?: string;
@@ -1285,201 +1629,69 @@ export interface QueryAnnexDto { @@ -1285,201 +1629,69 @@ export interface QueryAnnexDto {
1285 export interface QueryBankStatementDto { 1629 export interface QueryBankStatementDto {
1286 /** 1630 /**
1287 * @description 1631 * @description
1288 - * 帐号名称 1632 + * amount
  1633 + * @format double
1289 */ 1634 */
1290 - accountName?: string; 1635 + amount?: number;
1291 /** 1636 /**
1292 * @description 1637 * @description
1293 - * 账号 1638 + * collection_date
  1639 + * @format date
1294 */ 1640 */
1295 - accountNumber?: string; 1641 + collectionDatetimeBegin?: string;
1296 /** 1642 /**
1297 * @description 1643 * @description
1298 - * 实付金额 1644 + * collection_date
  1645 + * @format date
1299 */ 1646 */
1300 - actualPaymentAmount?: number; 1647 + collectionDatetimeEnd?: string;
  1648 + /** @format int32 */
  1649 + current?: number;
  1650 + /** @format int64 */
  1651 + id?: number;
  1652 + /** @format int32 */
  1653 + pageSize?: number;
1301 /** 1654 /**
1302 * @description 1655 * @description
1303 - * 余额 1656 + * payee
1304 */ 1657 */
1305 - balance?: number; 1658 + payee?: string;
1306 /** 1659 /**
1307 * @description 1660 * @description
1308 - * 银行订单号 1661 + * payer
1309 */ 1662 */
1310 - bankOrderNumber?: string; 1663 + payer?: string;
1311 /** 1664 /**
1312 * @description 1665 * @description
1313 - * 交易日-开始  
1314 - * @format date 1666 + * remark
1315 */ 1667 */
1316 - beginTransactionDate?: string; 1668 + remark?: string;
  1669 + remarkNote?: string;
  1670 + serialNumber?: string;
  1671 + status?: string;
  1672 + /** @format int32 */
  1673 + total?: number;
  1674 +}
  1675 +
  1676 +export interface QueryCustomerInformationDto {
1317 /** 1677 /**
1318 * @description 1678 * @description
1319 - * 起息日-开始  
1320 - * @format date 1679 + * 单位
1321 */ 1680 */
1322 - beginValueDate?: string; 1681 + institution?: string;
1323 /** 1682 /**
1324 * @description 1683 * @description
1325 - * 借方金额 1684 + * 单位联系人
1326 */ 1685 */
1327 - borrowedAmount?: number; 1686 + institutionContactName?: string;
1328 /** 1687 /**
1329 * @description 1688 * @description
1330 - * 收银员 1689 + * 名称
1331 */ 1690 */
1332 - cashier?: string;  
1333 - /**  
1334 - * @description  
1335 - * 收款渠道  
1336 - */  
1337 - collectionChannel?: string;  
1338 - /**  
1339 - * @description  
1340 - * 币种  
1341 - */  
1342 - currency?: string;  
1343 - /** @format int32 */  
1344 - current?: number;  
1345 - /**  
1346 - * @description  
1347 - * 交易日-结束  
1348 - * @format date  
1349 - */  
1350 - endTransactionDate?: string;  
1351 - /**  
1352 - * @description  
1353 - * 起息日-结束  
1354 - * @format date  
1355 - */  
1356 - endValueDate?: string;  
1357 - /**  
1358 - * @description  
1359 - * 扩展摘要  
1360 - */  
1361 - extendedSummary?: string;  
1362 - /**  
1363 - * @description  
1364 - * id  
1365 - * @format int64  
1366 - */  
1367 - id?: number;  
1368 - /**  
1369 - * @description  
1370 - * 贷方金额  
1371 - */  
1372 - loanAmount?: number;  
1373 - /**  
1374 - * @description  
1375 - * 商户订单号  
1376 - */  
1377 - merchantOrderNumber?: string;  
1378 - /** @format int32 */  
1379 - pageSize?: number;  
1380 - /**  
1381 - * @description  
1382 - * 收(付)方账号  
1383 - */  
1384 - payeePayerAccountNumber?: string;  
1385 - /**  
1386 - * @description  
1387 - * 收(付)方开户行地址  
1388 - */  
1389 - payeePayerBankAddress?: string;  
1390 - /**  
1391 - * @description  
1392 - * 收(付)方开户行行号  
1393 - */  
1394 - payeePayerBankBranchCode?: string;  
1395 - /**  
1396 - * @description  
1397 - * 收(付)方开户行名  
1398 - */  
1399 - payeePayerBankName?: string;  
1400 - /**  
1401 - * @description  
1402 - * 收(付)方名称  
1403 - */  
1404 - payeePayerName?: string;  
1405 - /**  
1406 - * @description  
1407 - * 收(付)方单位  
1408 - */  
1409 - payeePayerUnit?: string;  
1410 - /**  
1411 - * @description  
1412 - * 支付类型  
1413 - */  
1414 - paymentType?: string;  
1415 - /**  
1416 - * @description  
1417 - * 附言  
1418 - */  
1419 - remarkNote?: string;  
1420 - /**  
1421 - * @description  
1422 - * 流水号  
1423 - */  
1424 - serialNumber?: string;  
1425 - /**  
1426 - * @description  
1427 - * 状态  
1428 - */  
1429 - status?: string;  
1430 - /**  
1431 - * @description  
1432 - * 摘要  
1433 - */  
1434 - summary?: string;  
1435 - /**  
1436 - * @description  
1437 - * 第三方订单号  
1438 - */  
1439 - thirdPartyOrderNumber?: string;  
1440 - /** @format int32 */  
1441 - total?: number;  
1442 - /**  
1443 - * @description  
1444 - * 交易金额  
1445 - */  
1446 - transactionAmount?: number;  
1447 - /**  
1448 - * @description  
1449 - * 交易分析码  
1450 - */  
1451 - transactionAnalysisCode?: string;  
1452 - /**  
1453 - * @description  
1454 - * 交易行所  
1455 - */  
1456 - transactionBankBranch?: string;  
1457 - /**  
1458 - * @description  
1459 - * 交易类型  
1460 - */  
1461 - transactionType?: string;  
1462 -}  
1463 -  
1464 -export interface QueryCustomerInformationDto {  
1465 - /**  
1466 - * @description  
1467 - * 单位  
1468 - */  
1469 - institution?: string;  
1470 - /**  
1471 - * @description  
1472 - * 单位联系人  
1473 - */  
1474 - institutionContactName?: string;  
1475 - /**  
1476 - * @description  
1477 - * 名称  
1478 - */  
1479 - name?: string;  
1480 -}  
1481 -  
1482 -export interface QueryHistoryRecordDto { 1691 + name?: string;
  1692 +}
  1693 +
  1694 +export interface QueryHistoryRecordDto {
1483 /** 1695 /**
1484 * @description 1696 * @description
1485 * 子订单id集合 1697 * 子订单id集合
@@ -1539,11 +1751,28 @@ export interface QueryReportFormsDto { @@ -1539,11 +1751,28 @@ export interface QueryReportFormsDto {
1539 statisticsMethod?: string; 1751 statisticsMethod?: string;
1540 } 1752 }
1541 1753
  1754 +export interface ReissueInvoiceDto {
  1755 + /** @format int64 */
  1756 + invoiceId?: number;
  1757 + notes?: string;
  1758 +}
  1759 +
1542 export interface ResetPwdVO { 1760 export interface ResetPwdVO {
1543 /** @format int64 */ 1761 /** @format int64 */
1544 userId?: number; 1762 userId?: number;
1545 } 1763 }
1546 1764
  1765 +export interface Resource {
  1766 + description?: string;
  1767 + file?: TsgFile;
  1768 + filename?: string;
  1769 + inputStream?: InputStream;
  1770 + open?: boolean;
  1771 + readable?: boolean;
  1772 + uri?: URI;
  1773 + url?: TsgURL;
  1774 +}
  1775 +
1547 export interface SalOrderSaveDto { 1776 export interface SalOrderSaveDto {
1548 id?: string; 1777 id?: string;
1549 } 1778 }
@@ -1605,6 +1834,29 @@ export interface TokenApiDto { @@ -1605,6 +1834,29 @@ export interface TokenApiDto {
1605 username?: string; 1834 username?: string;
1606 } 1835 }
1607 1836
  1837 +export interface URI {
  1838 + absolute?: boolean;
  1839 + authority?: string;
  1840 + fragment?: string;
  1841 + host?: string;
  1842 + opaque?: boolean;
  1843 + path?: string;
  1844 + /** @format int32 */
  1845 + port?: number;
  1846 + query?: string;
  1847 + rawAuthority?: string;
  1848 + rawFragment?: string;
  1849 + rawPath?: string;
  1850 + rawQuery?: string;
  1851 + rawSchemeSpecificPart?: string;
  1852 + rawUserInfo?: string;
  1853 + scheme?: string;
  1854 + schemeSpecificPart?: string;
  1855 + userInfo?: string;
  1856 +}
  1857 +
  1858 +export type URLStreamHandler = any;
  1859 +
1608 export interface Unit { 1860 export interface Unit {
1609 /** @format float */ 1861 /** @format float */
1610 coefficient?: number; 1862 coefficient?: number;
@@ -1713,10 +1965,493 @@ export interface UpdatePwdVO { @@ -1713,10 +1965,493 @@ export interface UpdatePwdVO {
1713 userId?: number; 1965 userId?: number;
1714 } 1966 }
1715 1967
  1968 +export interface UserAddressListRequest {
  1969 + keywords?: string;
  1970 + /** @format int32 */
  1971 + limit?: number;
  1972 +}
  1973 +
  1974 +export interface UserCenterInfoRequest {
  1975 + /** @format int32 */
  1976 + current?: number;
  1977 + /** @format int32 */
  1978 + pageSize?: number;
  1979 + /** @format int32 */
  1980 + total?: number;
  1981 + /**
  1982 + * @description
  1983 + * 类型:0=消费记录,1=积分明细,2=签到记录,3=持有优惠券,4=余额变动,5=好友关系
  1984 + * @format int32
  1985 + */
  1986 + type?: number;
  1987 + /**
  1988 + * @description
  1989 + * 用户id
  1990 + * @format int32
  1991 + */
  1992 + uid?: number;
  1993 +}
  1994 +
  1995 +export interface UserDetailRequest {
  1996 + /** @format int32 */
  1997 + current?: number;
  1998 + /** @format int32 */
  1999 + pageSize?: number;
  2000 + /**
  2001 + * @description
  2002 + * 手机号
  2003 + */
  2004 + phone?: string;
  2005 + /** @format int32 */
  2006 + total?: number;
  2007 + /**
  2008 + * @description
  2009 + * uid
  2010 + */
  2011 + uid?: string;
  2012 +}
  2013 +
  2014 +export interface UserListRequest {
  2015 + /** @format int32 */
  2016 + current?: number;
  2017 + /**
  2018 + * @description
  2019 + * 创建日期开始时间
  2020 + */
  2021 + dateLimit?: string;
  2022 + /**
  2023 + * @description
  2024 + * 单位
  2025 + */
  2026 + institution?: string;
  2027 + /**
  2028 + * @description
  2029 + * 课题组老师
  2030 + */
  2031 + institutionContactName?: string;
  2032 + /**
  2033 + * @description
  2034 + * 关键字
  2035 + */
  2036 + keywords?: string;
  2037 + /** @format int32 */
  2038 + pageSize?: number;
  2039 + /**
  2040 + * @description
  2041 + * 手机号
  2042 + */
  2043 + phone?: string;
  2044 + /**
  2045 + * @description
  2046 + * salesCode
  2047 + */
  2048 + salesCode?: string;
  2049 + /** @format int32 */
  2050 + total?: number;
  2051 + /**
  2052 + * @description
  2053 + * id
  2054 + * @format int32
  2055 + */
  2056 + uid?: number;
  2057 + /**
  2058 + * @description
  2059 + * 用户名
  2060 + */
  2061 + username?: string;
  2062 +}
  2063 +
1716 export interface View { 2064 export interface View {
1717 contentType?: string; 2065 contentType?: string;
1718 } 2066 }
1719 2067
  2068 +/**
  2069 + * @description
  2070 + * 确认收货请求
  2071 + */
  2072 +export interface ApiOrderConfirmReceiveRequest {
  2073 + /**
  2074 + * @description
  2075 + * 主订单id
  2076 + * @format int64
  2077 + */
  2078 + orderId?: number;
  2079 + /**
  2080 + * @description
  2081 + * 子订单id
  2082 + */
  2083 + subOrderIds?: Array<number>;
  2084 +}
  2085 +
  2086 +export interface TsgFile {
  2087 + absolute?: boolean;
  2088 + absoluteFile?: TsgFile;
  2089 + absolutePath?: string;
  2090 + canonicalFile?: TsgFile;
  2091 + canonicalPath?: string;
  2092 + directory?: boolean;
  2093 + executable?: boolean;
  2094 + file?: boolean;
  2095 + /** @format int64 */
  2096 + freeSpace?: number;
  2097 + hidden?: boolean;
  2098 + /** @format int64 */
  2099 + lastModified?: number;
  2100 + name?: string;
  2101 + parent?: string;
  2102 + parentFile?: TsgFile;
  2103 + path?: string;
  2104 + readable?: boolean;
  2105 + /** @format int64 */
  2106 + totalSpace?: number;
  2107 + /** @format int64 */
  2108 + usableSpace?: number;
  2109 + writable?: boolean;
  2110 +}
  2111 +
  2112 +export interface SalesRechargePrepaymentAuditRequest {
  2113 + /**
  2114 + * @description
  2115 + * 审核意见
  2116 + */
  2117 + auditNotes?: string;
  2118 + /**
  2119 + * @description
  2120 + * id集合
  2121 + */
  2122 + ids?: Array<number>;
  2123 + /**
  2124 + * @description
  2125 + * 是否通过
  2126 + */
  2127 + pass?: boolean;
  2128 +}
  2129 +
  2130 +export interface SalesRechargePrepaymentCreateRequest {
  2131 + /**
  2132 + * @description
  2133 + * 联系人
  2134 + */
  2135 + contactPerson?: string;
  2136 + /**
  2137 + * @description
  2138 + * 客户名称
  2139 + */
  2140 + customerName?: string;
  2141 + /**
  2142 + * @description
  2143 + * 备注
  2144 + */
  2145 + notes?: string;
  2146 + /**
  2147 + * @description
  2148 + * 手机号
  2149 + */
  2150 + phone?: string;
  2151 + /**
  2152 + * @description
  2153 + * 凭证
  2154 + */
  2155 + proofImages?: Array<string>;
  2156 + /**
  2157 + * @description
  2158 + * 充值金额
  2159 + */
  2160 + rechargeAmount?: number;
  2161 + /**
  2162 + * @description
  2163 + * 来源
  2164 + */
  2165 + rechargeSource?: string;
  2166 + /**
  2167 + * @description
  2168 + * 销售代表
  2169 + */
  2170 + salesCode?: string;
  2171 +}
  2172 +
  2173 +export interface SalesRechargePrepaymentDeleteRequest {
  2174 + /**
  2175 + * @description
  2176 + * id集合
  2177 + */
  2178 + ids?: Array<number>;
  2179 +}
  2180 +
  2181 +export interface SalesRechargePrepaymentRequest {
  2182 + /**
  2183 + * @description
  2184 + * 审核时间
  2185 + * @format date-time
  2186 + */
  2187 + auditDate?: string;
  2188 + /**
  2189 + * @description
  2190 + * 审核备注
  2191 + */
  2192 + auditNotes?: string;
  2193 + /**
  2194 + * @description
  2195 + * 审核人员
  2196 + */
  2197 + auditors?: string;
  2198 + /**
  2199 + * @description
  2200 + * 联系人
  2201 + */
  2202 + contactPerson?: string;
  2203 + /**
  2204 + * @description
  2205 + * 创建人员
  2206 + */
  2207 + createBy?: string;
  2208 + /**
  2209 + * @description
  2210 + * 创建时间开始时间
  2211 + * @format date-time
  2212 + */
  2213 + createTimeBeginTime?: string;
  2214 + /**
  2215 + * @description
  2216 + * 创建时间结束时间
  2217 + * @format date-time
  2218 + */
  2219 + createTimeEndTime?: string;
  2220 + /** @format int32 */
  2221 + current?: number;
  2222 + /**
  2223 + * @description
  2224 + * 客户名称
  2225 + */
  2226 + customerName?: string;
  2227 + /**
  2228 + * @description
  2229 + * 是否启用
  2230 + * @format int32
  2231 + */
  2232 + enableFlag?: number;
  2233 + /**
  2234 + * @description
  2235 + * id
  2236 + * @format int32
  2237 + */
  2238 + id?: number;
  2239 + /**
  2240 + * @description
  2241 + * 修改人员
  2242 + */
  2243 + modifyBy?: string;
  2244 + /**
  2245 + * @description
  2246 + * 修改时间
  2247 + * @format date-time
  2248 + */
  2249 + modifyTime?: string;
  2250 + /**
  2251 + * @description
  2252 + * 备注
  2253 + */
  2254 + notes?: string;
  2255 + /** @format int32 */
  2256 + pageSize?: number;
  2257 + /**
  2258 + * @description
  2259 + * 手机号
  2260 + */
  2261 + phone?: string;
  2262 + /**
  2263 + * @description
  2264 + * 充值金额
  2265 + */
  2266 + rechargeAmount?: number;
  2267 + /**
  2268 + * @description
  2269 + * 来源
  2270 + */
  2271 + rechargeSource?: string;
  2272 + /**
  2273 + * @description
  2274 + * 销售代表
  2275 + */
  2276 + salesCode?: string;
  2277 + /**
  2278 + * @description
  2279 + * 状态
  2280 + */
  2281 + status?: string;
  2282 + /** @format int32 */
  2283 + total?: number;
  2284 + /**
  2285 + * @description
  2286 + * 版本号
  2287 + * @format int32
  2288 + */
  2289 + version?: number;
  2290 +}
  2291 +
  2292 +export interface SalesRechargePrepaymentUpdateRequest {
  2293 + /**
  2294 + * @description
  2295 + * 联系人
  2296 + */
  2297 + contactPerson?: string;
  2298 + /**
  2299 + * @description
  2300 + * 客户名称
  2301 + */
  2302 + customerName?: string;
  2303 + /**
  2304 + * @description
  2305 + * 编号
  2306 + * @format int32
  2307 + */
  2308 + id?: number;
  2309 + /**
  2310 + * @description
  2311 + * 备注
  2312 + */
  2313 + notes?: string;
  2314 + /**
  2315 + * @description
  2316 + * 手机号
  2317 + */
  2318 + phone?: string;
  2319 + /**
  2320 + * @description
  2321 + * 凭证
  2322 + */
  2323 + proofImages?: Array<string>;
  2324 + /**
  2325 + * @description
  2326 + * 充值金额
  2327 + */
  2328 + rechargeAmount?: number;
  2329 + /**
  2330 + * @description
  2331 + * 来源
  2332 + */
  2333 + rechargeSource?: string;
  2334 + /**
  2335 + * @description
  2336 + * 销售代表
  2337 + */
  2338 + salesCode?: string;
  2339 +}
  2340 +
  2341 +/**
  2342 + * @description
  2343 + * 开票添加对象
  2344 + */
  2345 +export interface StoreOrderInvoiceRequest {
  2346 + /**
  2347 + * @description
  2348 + * 开票备注
  2349 + */
  2350 + comment?: string;
  2351 + /**
  2352 + * @description
  2353 + * 开票内容
  2354 + */
  2355 + content?: string;
  2356 + /**
  2357 + * @description
  2358 + * 创建时间
  2359 + * @format date-time
  2360 + */
  2361 + createTime?: string;
  2362 + /**
  2363 + * @description
  2364 + * 关联订单id
  2365 + */
  2366 + orderIdList?: Array<number>;
  2367 + /**
  2368 + * @description
  2369 + * 买方注册地址
  2370 + */
  2371 + partyAAddress?: string;
  2372 + /**
  2373 + * @description
  2374 + * 买方开户行账号
  2375 + */
  2376 + partyABankAccount?: string;
  2377 + /**
  2378 + * @description
  2379 + * 买方名称
  2380 + */
  2381 + partyAName?: string;
  2382 + /**
  2383 + * @description
  2384 + * 买方开户行
  2385 + */
  2386 + partyAOpenBank?: string;
  2387 + /**
  2388 + * @description
  2389 + * 买方电话号码
  2390 + */
  2391 + partyAPhoneNumber?: string;
  2392 + /**
  2393 + * @description
  2394 + * 买方税号
  2395 + */
  2396 + partyATaxid?: string;
  2397 + /**
  2398 + * @description
  2399 + * 抬头类型
  2400 + */
  2401 + partyAType?: string;
  2402 + /**
  2403 + * @description
  2404 + * 卖方名称
  2405 + */
  2406 + partyBName?: string;
  2407 + /**
  2408 + * @description
  2409 + * 发票金额
  2410 + * @format double
  2411 + */
  2412 + price?: number;
  2413 + /**
  2414 + * @description
  2415 + * 接收邮箱地址
  2416 + */
  2417 + receiveEmail?: string;
  2418 + /**
  2419 + * @description
  2420 + * 发票类型
  2421 + */
  2422 + type?: string;
  2423 + /**
  2424 + * @description
  2425 + * 用户id
  2426 + */
  2427 + uid?: string;
  2428 + /**
  2429 + * @description
  2430 + * 更新时间
  2431 + * @format date-time
  2432 + */
  2433 + updateTime?: string;
  2434 +}
  2435 +
  2436 +export interface TsgURL {
  2437 + authority?: string;
  2438 + content?: any;
  2439 + /** @format int32 */
  2440 + defaultPort?: number;
  2441 + deserializedFields?: URLStreamHandler;
  2442 + file?: string;
  2443 + host?: string;
  2444 + path?: string;
  2445 + /** @format int32 */
  2446 + port?: number;
  2447 + protocol?: string;
  2448 + query?: string;
  2449 + ref?: string;
  2450 + /** @format int32 */
  2451 + serializedHashCode?: number;
  2452 + userInfo?: string;
  2453 +}
  2454 +
1720 export interface UploadPaymentReceiptDTO { 2455 export interface UploadPaymentReceiptDTO {
1721 /** 2456 /**
1722 * @description 2457 * @description