feat(ship): 实现发货单据生成功能

- 新增发货单据生成接口及类型定义
- 优化创建页面逻辑,支持单据预览与下载
- 调整表单字段结构,增强数据完整性校验
- 更新司机信息字段命名以提高语义清晰度
- 重构部分页面交互流程,提升用户体验
This commit is contained in:
shenyifei 2025-11-08 16:08:56 +08:00
parent e1d4824ad8
commit 835cc21315
4 changed files with 144 additions and 63 deletions

View File

@ -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>
)} )}

View File

@ -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默认没有生成对象)

View File

@ -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