feat(ship): 实现发货单据生成功能
- 新增发货单据生成接口及类型定义 - 优化创建页面逻辑,支持单据预览与下载 - 调整表单字段结构,增强数据完整性校验 - 更新司机信息字段命名以提高语义清晰度 - 重构部分页面交互流程,提升用户体验
This commit is contained in:
parent
e1d4824ad8
commit
835cc21315
@ -18,6 +18,7 @@ import Taro from "@tarojs/taro";
|
|||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import { business } from "@/services";
|
import { business } from "@/services";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
|
import buildUrl from "@/utils/buildUrl";
|
||||||
|
|
||||||
export default hocAuth(function Page(props: CommonComponent) {
|
export default hocAuth(function Page(props: CommonComponent) {
|
||||||
const { router, setLoading } = props;
|
const { router, setLoading } = props;
|
||||||
@ -59,7 +60,7 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
const [height, setHeight] = useState<number>();
|
const [height, setHeight] = useState<number>();
|
||||||
const [shipOrderVO, setShipOrderVO] = useState<BusinessAPI.ShipOrderVO>();
|
const [shipOrderVO, setShipOrderVO] = useState<BusinessAPI.ShipOrderVO>();
|
||||||
const [deliveryTemplate, setDeliveryTemplate] = useState<string>();
|
const [deliveryTemplate, setDeliveryTemplate] = useState<string>();
|
||||||
const [previewUrl, setPreviewUrl] = useState<string>();
|
const [shipDocument, setShipDocument] = useState<string>();
|
||||||
|
|
||||||
// 表单错误状态
|
// 表单错误状态
|
||||||
const [formErrors, setFormErrors] = useState<{
|
const [formErrors, setFormErrors] = useState<{
|
||||||
@ -71,6 +72,7 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
}>({});
|
}>({});
|
||||||
|
|
||||||
const init = async (shipOrderId: BusinessAPI.ShipOrderVO["shipOrderId"]) => {
|
const init = async (shipOrderId: BusinessAPI.ShipOrderVO["shipOrderId"]) => {
|
||||||
|
setLoading(true);
|
||||||
const { data } = await business.shipOrder.showShipOrder({
|
const { data } = await business.shipOrder.showShipOrder({
|
||||||
shipOrderShowQry: {
|
shipOrderShowQry: {
|
||||||
shipOrderId,
|
shipOrderId,
|
||||||
@ -79,6 +81,10 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
const shipOrderVO = data.data;
|
const shipOrderVO = data.data;
|
||||||
if (shipOrderVO) {
|
if (shipOrderVO) {
|
||||||
setShipOrderVO(shipOrderVO);
|
setShipOrderVO(shipOrderVO);
|
||||||
|
if (shipOrderVO.shipDocument) {
|
||||||
|
setStep(3);
|
||||||
|
setShipDocument(shipOrderVO.shipDocument);
|
||||||
|
}
|
||||||
|
|
||||||
const { data } = await business.dealer.showDealer({
|
const { data } = await business.dealer.showDealer({
|
||||||
dealerShowQry: {
|
dealerShowQry: {
|
||||||
@ -88,6 +94,7 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
|
|
||||||
setDeliveryTemplate(data.data?.deliveryTemplate!);
|
setDeliveryTemplate(data.data?.deliveryTemplate!);
|
||||||
}
|
}
|
||||||
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -1214,8 +1221,54 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 存储 至 shipOrder previewUrl
|
||||||
|
if (shipOrderVO) {
|
||||||
|
let formData: BusinessAPI.ShipOrderGenerateDocumentCmd = {
|
||||||
|
shipOrderId: shipOrderVO?.shipOrderId,
|
||||||
|
shipDocument: data.path,
|
||||||
|
};
|
||||||
|
// 检查各模块中的必填字段是否已填写
|
||||||
|
for (const module of moduleList) {
|
||||||
|
const contentSchema = module.schemas.find(
|
||||||
|
(schema) => schema.title === "内容配置",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (
|
||||||
|
!contentSchema ||
|
||||||
|
!contentSchema.columns ||
|
||||||
|
contentSchema.columns.length === 0
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const column of contentSchema.columns) {
|
||||||
|
// 检查西瓜品级字段是否开启且已填写
|
||||||
|
if (column.dataIndex === "requiredWatermelonGrade") {
|
||||||
|
formData.watermelonGrade = shipOrderVO?.watermelonGrade;
|
||||||
|
}
|
||||||
|
// 检查发货地字段是否开启且已填写
|
||||||
|
else if (column.dataIndex === "requiredShippingFrom") {
|
||||||
|
formData.shippingAddress = shipOrderVO?.shippingAddress;
|
||||||
|
}
|
||||||
|
// 检查预计到仓时间字段是否开启且已填写
|
||||||
|
else if (column.dataIndex === "requiredEstimatedArrivalTime") {
|
||||||
|
formData.estimatedArrivalDate = shipOrderVO?.estimatedArrivalDate;
|
||||||
|
}
|
||||||
|
// 检查备注字段是否开启且已填写
|
||||||
|
else if (column.dataIndex === "requiredRemarks") {
|
||||||
|
formData.remark = shipOrderVO?.remark;
|
||||||
|
}
|
||||||
|
// 检查品级字段是否开启且已填写
|
||||||
|
else if (column.dataIndex === "requiredGrade") {
|
||||||
|
formData.shipOrderItemList = shipOrderVO?.shipOrderItemList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
business.shipOrder.generateDocumentShipOrder(formData).then();
|
||||||
|
}
|
||||||
|
|
||||||
if (data && data.path) {
|
if (data && data.path) {
|
||||||
setPreviewUrl(data.path);
|
setShipDocument(data.path);
|
||||||
// 保存到系统相册
|
// 保存到系统相册
|
||||||
Taro.downloadFile({
|
Taro.downloadFile({
|
||||||
url: data.path,
|
url: data.path,
|
||||||
@ -1261,10 +1314,7 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
setFormErrors({});
|
setFormErrors({});
|
||||||
// 重新加载初始数据
|
// 重新加载初始数据
|
||||||
if (shipOrderId) {
|
if (shipOrderId) {
|
||||||
setLoading(true);
|
init(shipOrderId).then();
|
||||||
init(shipOrderId).then(() => {
|
|
||||||
setLoading(false);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1366,10 +1416,10 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
duration: 2000,
|
duration: 2000,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (previewUrl) {
|
if (shipDocument) {
|
||||||
// 保存到系统相册
|
// 保存到系统相册
|
||||||
Taro.downloadFile({
|
Taro.downloadFile({
|
||||||
url: previewUrl,
|
url: shipDocument,
|
||||||
}).then((downloadRes) => {
|
}).then((downloadRes) => {
|
||||||
console.log("downloadRes", downloadRes);
|
console.log("downloadRes", downloadRes);
|
||||||
if (downloadRes.tempFilePath) {
|
if (downloadRes.tempFilePath) {
|
||||||
@ -2116,7 +2166,7 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{step === 3 && previewUrl && (
|
{step === 3 && shipDocument && (
|
||||||
<View className="flex flex-1 flex-col items-center justify-center rounded-lg bg-white p-4 shadow-md">
|
<View className="flex flex-1 flex-col items-center justify-center rounded-lg bg-white p-4 shadow-md">
|
||||||
<View className="mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-green-100">
|
<View className="mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-green-100">
|
||||||
<Text className="text-2xl text-green-600">✓</Text>
|
<Text className="text-2xl text-green-600">✓</Text>
|
||||||
@ -2216,9 +2266,13 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
type="default"
|
type="default"
|
||||||
block
|
block
|
||||||
size={"large"}
|
size={"large"}
|
||||||
onClick={regenerateDocument}
|
onClick={() =>
|
||||||
|
Taro.switchTab({
|
||||||
|
url: buildUrl("/pages/main/index/index"),
|
||||||
|
})
|
||||||
|
}
|
||||||
>
|
>
|
||||||
重新生成
|
返回首页
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
@ -2228,9 +2282,9 @@ export default hocAuth(function Page(props: CommonComponent) {
|
|||||||
type="primary"
|
type="primary"
|
||||||
block
|
block
|
||||||
size={"large"}
|
size={"large"}
|
||||||
onClick={() => Taro.navigateBack()}
|
onClick={regenerateDocument}
|
||||||
>
|
>
|
||||||
完成
|
重新生成
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -35,6 +35,36 @@ export async function destroyShipOrder(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 发货单生成单据 PUT /operation/generateDocumentShipOrder */
|
||||||
|
export async function generateDocumentShipOrder(
|
||||||
|
body: BusinessAPI.ShipOrderGenerateDocumentCmd,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<BusinessAPI.Response>("/operation/generateDocumentShipOrder", {
|
||||||
|
method: "PUT",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
data: body,
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 发货单生成单据 PATCH /operation/generateDocumentShipOrder */
|
||||||
|
export async function generateDocumentShipOrder1(
|
||||||
|
body: BusinessAPI.ShipOrderGenerateDocumentCmd,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<BusinessAPI.Response>("/operation/generateDocumentShipOrder", {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
data: body,
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** 发货单列表 GET /operation/listShipOrder */
|
/** 发货单列表 GET /operation/listShipOrder */
|
||||||
export async function listShipOrder(
|
export async function listShipOrder(
|
||||||
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
||||||
|
|||||||
@ -3309,6 +3309,10 @@ declare namespace BusinessAPI {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type ShipOrderCreateCmd = {
|
type ShipOrderCreateCmd = {
|
||||||
|
/** 创建人ID */
|
||||||
|
createdBy: string;
|
||||||
|
/** 创建人姓名 */
|
||||||
|
createdByName?: string;
|
||||||
/** 发货单ID */
|
/** 发货单ID */
|
||||||
shipOrderId: string;
|
shipOrderId: string;
|
||||||
/** 采购单ID */
|
/** 采购单ID */
|
||||||
@ -3327,6 +3331,8 @@ declare namespace BusinessAPI {
|
|||||||
watermelonGrade?: string;
|
watermelonGrade?: string;
|
||||||
/** 司机姓名 */
|
/** 司机姓名 */
|
||||||
driverName?: string;
|
driverName?: string;
|
||||||
|
/** 司机手机号 */
|
||||||
|
driverPhone?: string;
|
||||||
/** 车牌号码 */
|
/** 车牌号码 */
|
||||||
licensePlate?: string;
|
licensePlate?: string;
|
||||||
/** 运费欠款(元) */
|
/** 运费欠款(元) */
|
||||||
@ -3349,10 +3355,6 @@ declare namespace BusinessAPI {
|
|||||||
farmerInfo?: string;
|
farmerInfo?: string;
|
||||||
/** 备注 */
|
/** 备注 */
|
||||||
remark?: string;
|
remark?: string;
|
||||||
/** 创建人ID */
|
|
||||||
createdBy: string;
|
|
||||||
/** 创建人姓名 */
|
|
||||||
createdByName?: string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type ShipOrderDestroyCmd = {
|
type ShipOrderDestroyCmd = {
|
||||||
@ -3360,6 +3362,27 @@ declare namespace BusinessAPI {
|
|||||||
shipOrderId: string;
|
shipOrderId: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type ShipOrderGenerateDocumentCmd = {
|
||||||
|
/** 发货单ID */
|
||||||
|
shipOrderId: string;
|
||||||
|
/** 预计到仓时间 */
|
||||||
|
estimatedArrivalDate?: string;
|
||||||
|
/** 西瓜品级 */
|
||||||
|
watermelonGrade?: string;
|
||||||
|
/** 发货地址 */
|
||||||
|
shippingAddress?: string;
|
||||||
|
/** 备注 */
|
||||||
|
remark?: string;
|
||||||
|
/** 发货单明细 */
|
||||||
|
shipOrderItemList?: ShipOrderItem[];
|
||||||
|
/** 发货单据 */
|
||||||
|
shipDocument?: string;
|
||||||
|
/** 采购底单 */
|
||||||
|
purchaseDocument?: string;
|
||||||
|
/** 成本单据 */
|
||||||
|
costDocument?: string;
|
||||||
|
};
|
||||||
|
|
||||||
type ShipOrderItem = {
|
type ShipOrderItem = {
|
||||||
/** 发货单子项ID */
|
/** 发货单子项ID */
|
||||||
itemId: string;
|
itemId: string;
|
||||||
@ -3428,13 +3451,6 @@ declare namespace BusinessAPI {
|
|||||||
status?: boolean;
|
status?: boolean;
|
||||||
/** 发货单ID */
|
/** 发货单ID */
|
||||||
shipOrderId?: string;
|
shipOrderId?: string;
|
||||||
/** 发货单状态:1_待回款;2_部分回款;3_已回款;4_拒收完结;5_已完结; */
|
|
||||||
state?:
|
|
||||||
| "WAIT_PAYMENT"
|
|
||||||
| "PARTIAL_PAYMENT"
|
|
||||||
| "FULL_PAYMENT"
|
|
||||||
| "REJECT_FINISH"
|
|
||||||
| "FINISH";
|
|
||||||
offset?: number;
|
offset?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3450,48 +3466,22 @@ declare namespace BusinessAPI {
|
|||||||
type ShipOrderUpdateCmd = {
|
type ShipOrderUpdateCmd = {
|
||||||
/** 发货单ID */
|
/** 发货单ID */
|
||||||
shipOrderId: string;
|
shipOrderId: string;
|
||||||
/** 采购单ID */
|
|
||||||
purchaseOrderId: string;
|
|
||||||
/** 发货单编号 */
|
|
||||||
orderSn?: string;
|
|
||||||
/** 发货地址 */
|
|
||||||
shippingAddress?: string;
|
|
||||||
/** 收货地址 */
|
|
||||||
receivingAddress?: string;
|
|
||||||
/** 发货日期 */
|
|
||||||
shippingDate?: string;
|
|
||||||
/** 预计到仓时间 */
|
/** 预计到仓时间 */
|
||||||
estimatedArrivalDate?: string;
|
estimatedArrivalDate?: string;
|
||||||
/** 西瓜品级 */
|
/** 西瓜品级 */
|
||||||
watermelonGrade?: string;
|
watermelonGrade?: string;
|
||||||
/** 司机姓名 */
|
/** 发货地址 */
|
||||||
driverName?: string;
|
shippingAddress?: string;
|
||||||
/** 车牌号码 */
|
|
||||||
licensePlate?: string;
|
|
||||||
/** 运费欠款(元) */
|
|
||||||
freightDebt?: number;
|
|
||||||
/** 草帘欠款(元) */
|
|
||||||
strawMatDebt?: number;
|
|
||||||
/** 商标费(元) */
|
|
||||||
trademarkFee?: number;
|
|
||||||
/** 人工费(元) */
|
|
||||||
laborFee?: number;
|
|
||||||
/** 纸箱费(元) */
|
|
||||||
cartonFee?: number;
|
|
||||||
/** 打码费(元) */
|
|
||||||
codingFee?: number;
|
|
||||||
/** 计提费(元) */
|
|
||||||
provisionFee?: number;
|
|
||||||
/** 合计金额(元) */
|
|
||||||
totalAmount?: number;
|
|
||||||
/** 瓜农姓名逗号隔开 */
|
|
||||||
farmerInfo?: string;
|
|
||||||
/** 备注 */
|
/** 备注 */
|
||||||
remark?: string;
|
remark?: string;
|
||||||
/** 创建人ID */
|
/** 发货单明细 */
|
||||||
createdBy: string;
|
shipOrderItemList?: ShipOrderItem[];
|
||||||
/** 创建人姓名 */
|
/** 发货单据 */
|
||||||
createdByName?: string;
|
shipDocument?: string;
|
||||||
|
/** 采购底单 */
|
||||||
|
purchaseDocument?: string;
|
||||||
|
/** 成本单据 */
|
||||||
|
costDocument?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ShipOrderVO = {
|
type ShipOrderVO = {
|
||||||
@ -3509,7 +3499,8 @@ declare namespace BusinessAPI {
|
|||||||
warehouseId?: string;
|
warehouseId?: string;
|
||||||
/** 仓库名称 */
|
/** 仓库名称 */
|
||||||
warehouseName?: string;
|
warehouseName?: string;
|
||||||
vehicleNo: string;
|
/** 车次号 */
|
||||||
|
vehicleNo?: string;
|
||||||
/** 发货地址 */
|
/** 发货地址 */
|
||||||
shippingAddress?: string;
|
shippingAddress?: string;
|
||||||
/** 收货地址 */
|
/** 收货地址 */
|
||||||
@ -3522,7 +3513,7 @@ declare namespace BusinessAPI {
|
|||||||
watermelonGrade?: string;
|
watermelonGrade?: string;
|
||||||
/** 司机姓名 */
|
/** 司机姓名 */
|
||||||
driverName?: string;
|
driverName?: string;
|
||||||
/** 司机手机 */
|
/** 司机手机号 */
|
||||||
driverPhone?: string;
|
driverPhone?: string;
|
||||||
/** 车牌号码 */
|
/** 车牌号码 */
|
||||||
licensePlate?: string;
|
licensePlate?: string;
|
||||||
@ -3544,6 +3535,12 @@ declare namespace BusinessAPI {
|
|||||||
totalAmount?: number;
|
totalAmount?: number;
|
||||||
/** 瓜农姓名逗号隔开 */
|
/** 瓜农姓名逗号隔开 */
|
||||||
farmerInfo?: string;
|
farmerInfo?: string;
|
||||||
|
/** 发货单据 */
|
||||||
|
shipDocument?: string;
|
||||||
|
/** 采购底单 */
|
||||||
|
purchaseDocument?: string;
|
||||||
|
/** 成本单据 */
|
||||||
|
costDocument?: string;
|
||||||
/** 发货单状态:1_待回款;2_部分回款;3_已回款;4_拒收完结;5_已完结; */
|
/** 发货单状态:1_待回款;2_部分回款;3_已回款;4_拒收完结;5_已完结; */
|
||||||
state?:
|
state?:
|
||||||
| "WAIT_PAYMENT"
|
| "WAIT_PAYMENT"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user