@@ -449,7 +464,7 @@
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
-import { getOrders, syncOrders, createWaybill, initDatabase, printWaybill, shipToDouyin, manualShip, createSalesOrder, clearAndResync, getShops, type Order, type Shop } from '@/api/order'
+import { getOrders, syncOrders, createWaybill, initDatabase, printWaybill, shipToDouyin, manualShip, createSalesOrder, clearAndResync, getShops, splitMergedOrders, unsplitOrders, type Order, type Shop } from '@/api/order'
import { getTokenByCredentials, getAuthorizeUrl } from '@/api/auth'
import { getBackendBaseUrl } from '@/utils/config'
@@ -923,6 +938,47 @@ const handleBatchCreateWaybill = async () => {
}
}
+// 拆分合并单:把一组合并订单重新拆开,分别发货
+const handleSplitMerged = async (row: Order) => {
+ const ids = (row.mergedOrderIds && row.mergedOrderIds.length > 1) ? row.mergedOrderIds : [row.id]
+ if (ids.length < 2) {
+ ElMessage.info('该行不是合并订单,无需拆分')
+ return
+ }
+ try {
+ await ElMessageBox.confirm(
+ `确定要拆分这 ${ids.length} 笔合并订单吗?\n\n拆分后,这些订单将分别单独发货,不会再按"同买家+同地址"自动合并。如需恢复,可在"已拆分"标签旁点击"恢复合并"。`,
+ '拆分合并单',
+ { confirmButtonText: '确定拆分', cancelButtonText: '取消', type: 'warning' }
+ )
+ } catch {
+ return
+ }
+ try {
+ loading.value = true
+ const { data } = await splitMergedOrders(ids)
+ ElMessage.success(data?.message || `已拆分 ${ids.length} 笔订单`)
+ await fetchOrders()
+ fetchStats()
+ } catch (err: any) {
+ ElMessage.error(err?.response?.data?.message || err?.message || '拆分失败')
+ } finally {
+ loading.value = false
+ }
+}
+
+// 恢复合并:取消"拆分"标记,下次列表会重新自动合并
+const handleUnsplit = async (row: Order) => {
+ try {
+ const { data } = await unsplitOrders([row.id])
+ ElMessage.success(data?.message || '已恢复合并')
+ await fetchOrders()
+ fetchStats()
+ } catch (err: any) {
+ ElMessage.error(err?.response?.data?.message || err?.message || '恢复合并失败')
+ }
+}
+
// 创建运单(合并单跳转到合并编辑页;单笔订单走原有流程)
const handleCreateWaybill = async (order: Order) => {
if (order.status === 2 || order.status === 3 || order.status === 4) {
diff --git a/Antis.Erp.Plat/netcore/src/Application/NCC.API/appsettings.json b/Antis.Erp.Plat/netcore/src/Application/NCC.API/appsettings.json
index 21087ca..608a1bd 100755
--- a/Antis.Erp.Plat/netcore/src/Application/NCC.API/appsettings.json
+++ b/Antis.Erp.Plat/netcore/src/Application/NCC.API/appsettings.json
@@ -183,7 +183,7 @@
"NCC_App": {
"CodeAreasName": "SubDev,Food,Extend,test",
//系统文件路径(末尾必须带斜杆)
- "SystemPath": "/Users/hexiaodong/Desktop/git/erp2025/Antis.Erp.Plat/netcore/uu-resources/",
+ "SystemPath": "/Users/mr.wang/代码库/file",
//微信公众号允许上传文件类型
"MPUploadFileType": "bmp,png,jpeg,jpg,gif,mp3,wma,wav,amr,mp4",
//微信允许上传文件类型
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdCrInput.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdCrInput.cs
index 5a78ab8..08f0649 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdCrInput.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdCrInput.cs
@@ -32,6 +32,11 @@ namespace NCC.Extend.Entitys.Dto.WtXsckd
/// 经手人
///
public string jsr { get; set; }
+
+ ///
+ /// 发货人(抖音销售出库单必填;存用户 Id)
+ ///
+ public string fhr { get; set; }
///
/// 原价金额(订单原价,与收银台一致)
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs
index 49d19b5..b6b746e 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdInfoOutput.cs
@@ -37,6 +37,11 @@ namespace NCC.Extend.Entitys.Dto.WtXsckd
/// 经手人
///
public string jsr { get; set; }
+
+ ///
+ /// 发货人(详情展示 RealName;抖音销售出库单专用)
+ ///
+ public string fhr { get; set; }
///
/// 原价金额(订单原价)
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdListOutput.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdListOutput.cs
index 67a0acb..288657e 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdListOutput.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/WtXsckdListOutput.cs
@@ -32,6 +32,11 @@ namespace NCC.Extend.Entitys.Dto.WtXsckd
/// 经手人
///
public string jsr { get; set; }
+
+ ///
+ /// 发货人(已转为 RealName 展示;抖音销售出库单专用)
+ ///
+ public string fhr { get; set; }
///
/// 原价金额(订单原价)
@@ -133,6 +138,16 @@ namespace NCC.Extend.Entitys.Dto.WtXsckd
/// 收银批次号(同一次结账多单关联)
///
public string sy_pch { get; set; }
+
+ ///
+ /// 物流运单号
+ ///
+ public string yddh { get; set; }
+
+ ///
+ /// 抖音订单号
+ ///
+ public string dyddh { get; set; }
///
/// 关联退货单单号(销售/预售出库单:逗号分隔的退货单 F_Id)
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtDyDpszEntity.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtDyDpszEntity.cs
index 502453f..9c1264f 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtDyDpszEntity.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtDyDpszEntity.cs
@@ -38,9 +38,77 @@ namespace NCC.Extend.Entitys
public string Skzh { get; set; }
///
+ /// 出库仓库ID(抖音发货单专用,不再使用全局默认仓库)
+ ///
+ [SugarColumn(ColumnName = "F_Ck", IsNullable = true)]
+ public string Ck { get; set; }
+
+ ///
/// 备注
///
[SugarColumn(ColumnName = "F_Bz", Length = 500, IsNullable = true)]
public string Bz { get; set; }
+
+ ///
+ /// 抖音开放平台 AppKey
+ ///
+ [SugarColumn(ColumnName = "F_AppKey", Length = 100, IsNullable = true)]
+ public string AppKey { get; set; }
+
+ ///
+ /// 抖音开放平台 AppSecret
+ ///
+ [SugarColumn(ColumnName = "F_AppSecret", Length = 200, IsNullable = true)]
+ public string AppSecret { get; set; }
+
+ ///
+ /// 授权回调地址
+ ///
+ [SugarColumn(ColumnName = "F_CallbackUrl", Length = 300, IsNullable = true)]
+ public string CallbackUrl { get; set; }
+
+ ///
+ /// API 基础地址,默认 https://openapi-fxg.jinritemai.com
+ ///
+ [SugarColumn(ColumnName = "F_ApiBaseUrl", Length = 200, IsNullable = true)]
+ public string ApiBaseUrl { get; set; }
+
+ ///
+ /// 同步订单查询天数(默认 30 天)
+ ///
+ [SugarColumn(ColumnName = "F_SyncDays", IsNullable = true)]
+ public int? SyncDays { get; set; }
+
+ /// 发货人姓名
+ [SugarColumn(ColumnName = "F_SenderName", Length = 100, IsNullable = true)]
+ public string SenderName { get; set; }
+
+ /// 发货人电话
+ [SugarColumn(ColumnName = "F_SenderPhone", Length = 50, IsNullable = true)]
+ public string SenderPhone { get; set; }
+
+ /// 发货人详细地址
+ [SugarColumn(ColumnName = "F_SenderAddress", Length = 300, IsNullable = true)]
+ public string SenderAddress { get; set; }
+
+ /// 发货人省份
+ [SugarColumn(ColumnName = "F_SenderProvince", Length = 50, IsNullable = true)]
+ public string SenderProvince { get; set; }
+
+ /// 发货人城市
+ [SugarColumn(ColumnName = "F_SenderCity", Length = 50, IsNullable = true)]
+ public string SenderCity { get; set; }
+
+ /// 发货人区县
+ [SugarColumn(ColumnName = "F_SenderDistrict", Length = 50, IsNullable = true)]
+ public string SenderDistrict { get; set; }
+
+ /// 发货人街道
+ [SugarColumn(ColumnName = "F_SenderStreet", Length = 100, IsNullable = true)]
+ public string SenderStreet { get; set; }
+
+ /// 启用状态:1=启用,0=停用(停用后不再同步订单)
+ [SugarColumn(ColumnName = "F_Enabled", IsNullable = true)]
+ public int? Enabled { get; set; }
}
}
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtXsckdEntity.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtXsckdEntity.cs
index 93456df..cb23503 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtXsckdEntity.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/WtXsckdEntity.cs
@@ -40,6 +40,12 @@ namespace NCC.Extend.Entitys
///
[SugarColumn(ColumnName = "jsr")]
public string Jsr { get; set; }
+
+ ///
+ /// 发货人(抖音发货单提交销售出库时必填;独立于经手人。存 ERP 用户 Id)
+ ///
+ [SugarColumn(ColumnName = "fhr", IsNullable = true)]
+ public string Fhr { get; set; }
///
/// 原价金额(订单原价,与收银台一致)
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/BillSummary/WtBillSummaryService.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/BillSummary/WtBillSummaryService.cs
index 2a03d68..710a9a0 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/BillSummary/WtBillSummaryService.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/BillSummary/WtBillSummaryService.cs
@@ -218,15 +218,26 @@ namespace NCC.Extend.BillSummary
jsrDisp = jList[0] ?? "";
}
+ // 与 GetInfo一致:gys 多为 wt_wldw 主键;历史可能为 wt_gys或已存展示名
string gysDisp = "";
if (!string.IsNullOrWhiteSpace(xsckd.Gys))
{
- var gList = await _db.Queryable()
- .Where(g => g.Id == xsckd.Gys)
- .Select(g => g.Gysmc)
+ var rawGys = xsckd.Gys.Trim();
+ var wldwMcList = await _db.Queryable()
+ .Where(w => w.Id == rawGys)
+ .Select(w => w.Dwmc)
.ToListAsync();
- if (gList.Count > 0)
- gysDisp = gList[0] ?? "";
+ if (wldwMcList.Count > 0 && !string.IsNullOrWhiteSpace(wldwMcList[0]))
+ gysDisp = wldwMcList[0]!.Trim();
+ else
+ {
+ var gList = await _db.Queryable()
+ .Where(g => g.Id == rawGys)
+ .Select(g => g.Gysmc)
+ .ToListAsync();
+ var gysmc = gList.Count > 0 ? gList[0] : null;
+ gysDisp = string.IsNullOrWhiteSpace(gysmc) ? rawGys : gysmc.Trim();
+ }
}
var (cjckDisp, rkckDisp) = await ResolveMainWarehouseDisplayAsync(xsckd.Cjck, xsckd.Rkck);
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtDyDpszService.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtDyDpszService.cs
index b8d6272..41ed181 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtDyDpszService.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtDyDpszService.cs
@@ -12,7 +12,7 @@ using Yitter.IdGenerator;
namespace NCC.Extend.WtDyDpsz
{
///
- /// 抖音店铺设置服务(每个店铺对应的往来单位、收款账户)
+ /// 抖音店铺设置服务(每个店铺对应的抖音 API 配置、往来单位、收款账户、发货人等)
///
[ApiDescriptionSettings(Tag = "Extend", Name = "WtDyDpsz", Order = 200)]
[Route("api/Extend/[controller]")]
@@ -28,68 +28,149 @@ namespace NCC.Extend.WtDyDpsz
}
///
- /// 获取所有店铺设置
+ /// 确保 wt_dy_dpsz 表结构与实体同步(首次调用会检查并补齐新增列)。
///
- [HttpGet("")]
- [AllowAnonymous]
- public async Task GetList()
+ private static bool _dpszColsEnsured;
+ private static readonly object _dpszColsLock = new object();
+ private void EnsureWtDyDpszColumns()
{
- var list = await _db.Queryable().ToListAsync();
- return list.Select(e => new
+ if (_dpszColsEnsured) return;
+ lock (_dpszColsLock)
+ {
+ if (_dpszColsEnsured) return;
+ try
+ {
+ var cols = _db.Ado.SqlQuery(
+ "SELECT LOWER(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wt_dy_dpsz'");
+ var set = new HashSet(cols ?? new List());
+ if (set.Count > 0)
+ {
+ // 旧环境兼容:按需补齐列
+ if (!set.Contains("f_ck"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_Ck` VARCHAR(64) NULL COMMENT '出库仓库ID(抖音发货单专用)'");
+ if (!set.Contains("f_appkey"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_AppKey` VARCHAR(100) NULL COMMENT '抖音 AppKey'");
+ if (!set.Contains("f_appsecret"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_AppSecret` VARCHAR(200) NULL COMMENT '抖音 AppSecret'");
+ if (!set.Contains("f_callbackurl"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_CallbackUrl` VARCHAR(300) NULL COMMENT '授权回调地址'");
+ if (!set.Contains("f_apibaseurl"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_ApiBaseUrl` VARCHAR(200) NULL COMMENT '抖音 API 基础地址'");
+ if (!set.Contains("f_syncdays"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SyncDays` INT NULL COMMENT '同步订单查询天数'");
+ if (!set.Contains("f_sendername"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderName` VARCHAR(100) NULL COMMENT '发货人姓名'");
+ if (!set.Contains("f_senderphone"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderPhone` VARCHAR(50) NULL COMMENT '发货人电话'");
+ if (!set.Contains("f_senderaddress"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderAddress` VARCHAR(300) NULL COMMENT '发货人地址'");
+ if (!set.Contains("f_senderprovince"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderProvince` VARCHAR(50) NULL COMMENT '发货人省份'");
+ if (!set.Contains("f_sendercity"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderCity` VARCHAR(50) NULL COMMENT '发货人城市'");
+ if (!set.Contains("f_senderdistrict"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderDistrict` VARCHAR(50) NULL COMMENT '发货人区县'");
+ if (!set.Contains("f_senderstreet"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_SenderStreet` VARCHAR(100) NULL COMMENT '发货人街道'");
+ if (!set.Contains("f_enabled"))
+ _db.Ado.ExecuteCommand("ALTER TABLE `wt_dy_dpsz` ADD COLUMN `F_Enabled` INT NULL DEFAULT 1 COMMENT '启用状态'");
+ }
+ }
+ catch
+ {
+ // 忽略:表不存在或无权限;由 CodeFirst/迁移流程处理
+ }
+ _dpszColsEnsured = true;
+ }
+ }
+
+ ///
+ /// 转换为对外 DTO(前端/列表用,脱敏 AppSecret)。
+ ///
+ private static object ToOutputDto(WtDyDpszEntity e, bool includeSecret)
+ {
+ return new
{
id = e.Id,
shopId = e.ShopId,
shopName = e.ShopName ?? "",
kh = e.Kh ?? "",
skzh = e.Skzh ?? "",
- bz = e.Bz ?? ""
- });
+ ck = e.Ck ?? "",
+ bz = e.Bz ?? "",
+ appKey = e.AppKey ?? "",
+ // 列表页默认不回显 AppSecret,编辑时才返回
+ appSecret = includeSecret ? (e.AppSecret ?? "") : "",
+ callbackUrl = e.CallbackUrl ?? "",
+ apiBaseUrl = e.ApiBaseUrl ?? "",
+ syncDays = e.SyncDays ?? 30,
+ senderName = e.SenderName ?? "",
+ senderPhone = e.SenderPhone ?? "",
+ senderAddress = e.SenderAddress ?? "",
+ senderProvince = e.SenderProvince ?? "",
+ senderCity = e.SenderCity ?? "",
+ senderDistrict = e.SenderDistrict ?? "",
+ senderStreet = e.SenderStreet ?? "",
+ enabled = e.Enabled ?? 1
+ };
}
///
- /// 根据店铺ID获取设置
+ /// 获取所有店铺设置(列表用,AppSecret 脱敏)
+ ///
+ [HttpGet("")]
+ [AllowAnonymous]
+ public async Task GetList()
+ {
+ EnsureWtDyDpszColumns();
+ var list = await _db.Queryable().ToListAsync();
+ return list.Select(e => ToOutputDto(e, includeSecret: false));
+ }
+
+ ///
+ /// 内部接口:抖音后端启动/刷新时拉取全部启用店铺的完整配置(含 AppSecret)
+ ///
+ [HttpGet("internal/all")]
+ [AllowAnonymous]
+ public async Task GetInternalAll()
+ {
+ EnsureWtDyDpszColumns();
+ var list = await _db.Queryable()
+ .Where(e => e.Enabled == null || e.Enabled == 1)
+ .ToListAsync();
+ return list.Select(e => ToOutputDto(e, includeSecret: true));
+ }
+
+ ///
+ /// 根据店铺ID获取设置(供抖音发货单按店铺读取往来单位/收款账户/仓库)
///
[HttpGet("by-shop/{shopId}")]
[AllowAnonymous]
public async Task GetByShopId(long shopId)
{
+ EnsureWtDyDpszColumns();
var entity = await _db.Queryable()
.Where(e => e.ShopId == shopId)
.FirstAsync();
if (entity == null)
return null;
- return new
- {
- id = entity.Id,
- shopId = entity.ShopId,
- shopName = entity.ShopName ?? "",
- kh = entity.Kh ?? "",
- skzh = entity.Skzh ?? "",
- bz = entity.Bz ?? ""
- };
+ return ToOutputDto(entity, includeSecret: false);
}
///
- /// 获取单条
+ /// 获取单条(编辑详情,返回 AppSecret)
///
[HttpGet("{id}")]
[AllowAnonymous]
public async Task GetInfo(string id)
{
+ EnsureWtDyDpszColumns();
var entity = await _db.Queryable()
.Where(e => e.Id == id)
.FirstAsync();
if (entity == null)
return null;
- return new
- {
- id = entity.Id,
- shopId = entity.ShopId,
- shopName = entity.ShopName ?? "",
- kh = entity.Kh ?? "",
- skzh = entity.Skzh ?? "",
- bz = entity.Bz ?? ""
- };
+ return ToOutputDto(entity, includeSecret: true);
}
///
@@ -99,6 +180,7 @@ namespace NCC.Extend.WtDyDpsz
[AllowAnonymous]
public async Task Create([FromBody] WtDyDpszInput input)
{
+ EnsureWtDyDpszColumns();
var exists = await _db.Queryable()
.Where(e => e.ShopId == input.ShopId)
.FirstAsync();
@@ -108,12 +190,8 @@ namespace NCC.Extend.WtDyDpsz
var entity = new WtDyDpszEntity
{
Id = YitIdHelper.NextId().ToString(),
- ShopId = input.ShopId,
- ShopName = input.ShopName ?? "",
- Kh = input.Kh ?? "",
- Skzh = input.Skzh ?? "",
- Bz = input.Bz ?? ""
};
+ ApplyInputToEntity(input, entity, isCreate: true);
await _db.Insertable(entity).ExecuteCommandAsync();
return new { msg = "保存成功", id = entity.Id };
}
@@ -125,17 +203,14 @@ namespace NCC.Extend.WtDyDpsz
[AllowAnonymous]
public async Task Update(string id, [FromBody] WtDyDpszInput input)
{
+ EnsureWtDyDpszColumns();
var entity = await _db.Queryable()
.Where(e => e.Id == id)
.FirstAsync();
if (entity == null)
return null;
- entity.ShopId = input.ShopId;
- entity.ShopName = input.ShopName ?? "";
- entity.Kh = input.Kh ?? "";
- entity.Skzh = input.Skzh ?? "";
- entity.Bz = input.Bz ?? "";
+ ApplyInputToEntity(input, entity, isCreate: false);
await _db.Updateable(entity).ExecuteCommandAsync();
return new { msg = "保存成功" };
}
@@ -150,6 +225,33 @@ namespace NCC.Extend.WtDyDpsz
await _db.Deleteable().Where(e => e.Id == id).ExecuteCommandAsync();
return new { msg = "删除成功" };
}
+
+ private static void ApplyInputToEntity(WtDyDpszInput input, WtDyDpszEntity entity, bool isCreate)
+ {
+ entity.ShopId = input.ShopId;
+ entity.ShopName = input.ShopName ?? "";
+ entity.Kh = input.Kh ?? "";
+ entity.Skzh = input.Skzh ?? "";
+ entity.Ck = input.Ck ?? "";
+ entity.Bz = input.Bz ?? "";
+ entity.AppKey = input.AppKey ?? "";
+ // 编辑时如未传 AppSecret,保留数据库中的原值,避免 UI 未回显时误清空
+ if (isCreate || !string.IsNullOrEmpty(input.AppSecret))
+ entity.AppSecret = input.AppSecret ?? "";
+ entity.CallbackUrl = input.CallbackUrl ?? "";
+ entity.ApiBaseUrl = string.IsNullOrWhiteSpace(input.ApiBaseUrl)
+ ? "https://openapi-fxg.jinritemai.com"
+ : input.ApiBaseUrl;
+ entity.SyncDays = input.SyncDays > 0 ? input.SyncDays : 30;
+ entity.SenderName = input.SenderName ?? "";
+ entity.SenderPhone = input.SenderPhone ?? "";
+ entity.SenderAddress = input.SenderAddress ?? "";
+ entity.SenderProvince = input.SenderProvince ?? "";
+ entity.SenderCity = input.SenderCity ?? "";
+ entity.SenderDistrict = input.SenderDistrict ?? "";
+ entity.SenderStreet = input.SenderStreet ?? "";
+ entity.Enabled = input.Enabled.HasValue ? input.Enabled.Value : 1;
+ }
}
public class WtDyDpszInput
@@ -158,6 +260,30 @@ namespace NCC.Extend.WtDyDpsz
public string ShopName { get; set; }
public string Kh { get; set; }
public string Skzh { get; set; }
+ /// 出库仓库ID(抖音发货单专用)
+ public string Ck { get; set; }
public string Bz { get; set; }
+
+ /// 抖音 AppKey
+ public string AppKey { get; set; }
+ /// 抖音 AppSecret(编辑时留空表示不修改)
+ public string AppSecret { get; set; }
+ /// 授权回调地址
+ public string CallbackUrl { get; set; }
+ /// API 基础地址
+ public string ApiBaseUrl { get; set; }
+ /// 同步订单查询天数
+ public int SyncDays { get; set; }
+
+ public string SenderName { get; set; }
+ public string SenderPhone { get; set; }
+ public string SenderAddress { get; set; }
+ public string SenderProvince { get; set; }
+ public string SenderCity { get; set; }
+ public string SenderDistrict { get; set; }
+ public string SenderStreet { get; set; }
+
+ /// 启用状态:1=启用,0=停用
+ public int? Enabled { get; set; }
}
}
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtSpService.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtSpService.cs
index c878663..9fc1fca 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtSpService.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtSpService.cs
@@ -756,6 +756,30 @@ CREATE TABLE `wt_sp_dysku` (
}
///
+ /// 商品编码唯一性检查:返回该编码是否已被其它商品占用
+ ///
+ /// 待校验的商品编码(前后空白会自动 trim;空值视为"未填",返回 exists=false)
+ /// 编辑场景下传入当前商品主键,避免把自己当作冲突
+ /// exists 为 true 时表示已被其他商品占用,id/spmc 给出占用方,用于前端提示
+ [HttpGet("Actions/CheckSpbm")]
+ public async Task CheckSpbm([FromQuery] string spbm, [FromQuery] string id)
+ {
+ var code = spbm?.Trim();
+ if (string.IsNullOrEmpty(code))
+ return new { exists = false };
+
+ var selfId = id?.Trim();
+ var dup = await _db.Queryable()
+ .Where(p => p.Spbm == code)
+ .WhereIF(!string.IsNullOrEmpty(selfId), p => p.Id != selfId)
+ .Select(p => new { p.Id, p.Spmc })
+ .FirstAsync();
+
+ if (dup == null) return new { exists = false };
+ return new { exists = true, id = dup.Id, spmc = dup.Spmc };
+ }
+
+ ///
/// 一次性修复 wt_sp_cost 历史数据:ck 存仓库名称的改为仓库 ID;F_Id 为「商品_仓库」等非雪花主键的改为 YitId。
///
private void MigrateSpCostCkToWarehouseId()
@@ -1101,10 +1125,23 @@ CREATE TABLE `wt_sp_dysku` (
EnsureWtSpDyskuTable();
var mergedSkus = MergeDyspidInputs(input.dyspid, input.dyspidList);
+ // 商品编码唯一性校验:非空时 wt_sp.F_Spbm 不允许重复
+ var newSpbm = input.spbm?.Trim();
+ if (!string.IsNullOrEmpty(newSpbm))
+ {
+ var dup = await _db.Queryable()
+ .Where(p => p.Spbm == newSpbm)
+ .Select(p => new { p.Id, p.Spmc })
+ .FirstAsync();
+ if (dup != null)
+ throw NCCException.Oh($"商品编码「{newSpbm}」已存在(商品:{dup.Spmc}),请更换编码");
+ }
+
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
entity.Pl = NormalizePlCsv(entity.Pl);
entity.Kc = 0;
+ if (!string.IsNullOrEmpty(newSpbm)) entity.Spbm = newSpbm;
entity.Dyspid = mergedSkus.Count > 0 ? mergedSkus[0] : null;
_db.BeginTran();
@@ -1334,9 +1371,22 @@ CREATE TABLE `wt_sp_dysku` (
// 添加调试信息
Console.WriteLine($"更新商品 - ID: {id}");
+ // 商品编码唯一性校验:非空时排除自身后不允许重复
+ var newSpbm = input.spbm?.Trim();
+ if (!string.IsNullOrEmpty(newSpbm))
+ {
+ var dup = await _db.Queryable()
+ .Where(p => p.Spbm == newSpbm && p.Id != id)
+ .Select(p => new { p.Id, p.Spmc })
+ .FirstAsync();
+ if (dup != null)
+ throw NCCException.Oh($"商品编码「{newSpbm}」已被其他商品使用(商品:{dup.Spmc}),请更换编码");
+ }
+
var entity = input.Adapt();
entity.Pl = NormalizePlCsv(entity.Pl);
entity.Id = id;
+ if (!string.IsNullOrEmpty(newSpbm)) entity.Spbm = newSpbm;
entity.Dyspid = mergedSkus.Count > 0 ? mergedSkus[0] : null;
_db.BeginTran();
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdService.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdService.cs
index b11262a..242f36b 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdService.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdService.cs
@@ -299,7 +299,7 @@ namespace NCC.Extend.WtTjd
}
///
- /// 反审调价单:将商品档案零售价(wt_sp.F_Lsj)恢复为明细中的调前单价,状态回退为草稿
+ /// 反审调价单:将商品成本(wt_sp_cost.cbj,按本单仓库 + 商品定位)恢复为明细中的调前单价,状态回退为草稿
///
/// 单据编号
///
@@ -322,9 +322,13 @@ namespace NCC.Extend.WtTjd
foreach (var mx in mxList)
{
- await _db.Updateable()
- .SetColumns(it => new WtSpEntity { Lsj = mx.Tqdj })
- .Where(it => it.Id == mx.Spbh)
+ var ckId = !string.IsNullOrEmpty(mx.Ck) ? mx.Ck : entity.Ck;
+ if (string.IsNullOrEmpty(ckId) || string.IsNullOrEmpty(mx.Spbh)) continue;
+
+ var tqdj = mx.Tqdj;
+ await _db.Updateable()
+ .SetColumns(it => new WtSpCostEntity { Cbj = tqdj })
+ .Where(it => it.Spbh == mx.Spbh && it.Ck == ckId)
.ExecuteCommandAsync();
}
@@ -344,10 +348,10 @@ namespace NCC.Extend.WtTjd
}
///
- /// 按仓库加载商品列表(含库存、档案零售价 tqdj、成本参考 cbj)
+ /// 按仓库加载商品列表(含库存、调前成本 tqdj)
///
/// 仓库ID
- /// 商品列表;tqdj 为 wt_sp.F_Lsj(调价基准),与「加载全部商品」口径一致
+ /// 商品列表;tqdj 为当前成本价 wt_sp_cost.cbj(调价基准为"成本"而非零售价)
[HttpGet("Actions/LoadProducts")]
public async Task LoadProducts([FromQuery] string ck)
{
@@ -355,9 +359,10 @@ namespace NCC.Extend.WtTjd
throw NCCException.Bah("仓库ID不能为空");
// 库存数量仅以 wt_sp_cost.sl 为准(流水账);无成本行或 sl=0 则不出现,不再用序列号条数兜底
+ // tqdj(调前单价)= wt_sp_cost.cbj(成本价),调价单调的是"成本",不是零售价
var products = await _db.Ado.SqlQueryAsync(
@"SELECT sc.spbh, sp.F_Spbm as spbm, sp.F_Spmc as spmc, sc.sl,
- IFNULL(sp.F_Lsj, 0) as tqdj, IFNULL(sc.cbj, 0) as cbj
+ IFNULL(sc.cbj, 0) as tqdj, IFNULL(sc.cbj, 0) as cbj
FROM wt_sp_cost sc
INNER JOIN wt_sp sp ON sc.spbh = sp.F_Id
WHERE sc.ck = @ck AND sc.sl > 0
@@ -494,7 +499,7 @@ namespace NCC.Extend.WtTjd
///
/// 加载某仓库曾在序列号表出现过的商品(按 spbh 聚合一条);在库数量 sl 取 wt_sp_cost.sl(流水账),不再按序列号条数统计。
- /// tqdj 为档案零售价 wt_sp.F_Lsj;cbj 为该仓成本单价。
+ /// tqdj 为该仓调前成本 wt_sp_cost.cbj(调价单调的是成本,不再取零售价)。
///
///
/// 禁止按 sn.spmc 分组,否则同一商品因序列号表名称空/不一致会拆成多行。
@@ -507,10 +512,11 @@ namespace NCC.Extend.WtTjd
if (string.IsNullOrEmpty(ck))
throw NCCException.Bah("仓库ID不能为空");
+ // tqdj(调前单价)= 该仓 wt_sp_cost.cbj(成本价)
var products = await _db.Ado.SqlQueryAsync(
@"SELECT sn.spbh, MAX(sp.F_Spbm) as spbm, MAX(sp.F_Spmc) as spmc,
IFNULL(MAX(sc.sl), 0) as sl,
- IFNULL(MAX(sp.F_Lsj), 0) as tqdj, IFNULL(MAX(sc.cbj), 0) as cbj
+ IFNULL(MAX(sc.cbj), 0) as tqdj, IFNULL(MAX(sc.cbj), 0) as cbj
FROM wt_serial_number sn
LEFT JOIN wt_sp sp ON sn.spbh = sp.F_Id
LEFT JOIN wt_sp_cost sc ON sn.spbh = sc.spbh AND sc.ck = @ck
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdWorkflowHelper.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdWorkflowHelper.cs
index 47f2282..aff8f92 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdWorkflowHelper.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtTjdWorkflowHelper.cs
@@ -11,6 +11,8 @@ namespace NCC.Extend.WtTjd
{
///
/// 商品调价单审批流(待办中心 / ApproveGeneric 转发),非独立 HTTP 控制器。
+ /// 注意:调价单调的是"成本",审核通过后将明细 Thdj(调后单价)写入 wt_sp_cost.cbj,
+ /// 不再写商品档案零售价 wt_sp.F_Lsj。
///
public class WtTjdWorkflowHelper : ITransient
{
@@ -101,7 +103,7 @@ namespace NCC.Extend.WtTjd
foreach (var mx in mxList)
{
if (string.IsNullOrWhiteSpace(mx.Spbh) || mx.Thdj <= 0)
- return new { success = false, message = "明细中存在未填写商品或调后售价为 0,请检查后再提交" };
+ return new { success = false, message = "明细中存在未填写商品或调后成本为 0,请检查后再提交" };
}
entity.Djzt = "待审核";
@@ -177,7 +179,7 @@ namespace NCC.Extend.WtTjd
return new { success = true, message = "一级审核通过,等待二级审核" };
}
- await ApplyFinalRetailPricesAsync(entity, mxList, userId, remark, "审核通过");
+ await ApplyFinalCostPricesAsync(entity, mxList, userId, remark, "审核通过");
_db.CommitTran();
return new { success = true, message = "审核通过" };
}
@@ -200,7 +202,7 @@ namespace NCC.Extend.WtTjd
return new { success = false, message = "当前用户不在商品调价单二级审核人员范围内" };
}
- await ApplyFinalRetailPricesAsync(entity, mxList, userId, remark, "二级通过");
+ await ApplyFinalCostPricesAsync(entity, mxList, userId, remark, "二级通过");
_db.CommitTran();
return new { success = true, message = "二级审核通过,审核完成" };
}
@@ -215,7 +217,11 @@ namespace NCC.Extend.WtTjd
}
}
- private async Task ApplyFinalRetailPricesAsync(WtTjdEntity entity, List mxList, string userId, string remark, string spbzTag)
+ ///
+ /// 终审通过:将明细 Thdj(调后单价)写入 wt_sp_cost.cbj(按本单仓库 + 商品定位),
+ /// 调价单调的是"成本",不再写商品档案零售价 wt_sp.F_Lsj
+ ///
+ private async Task ApplyFinalCostPricesAsync(WtTjdEntity entity, List mxList, string userId, string remark, string spbzTag)
{
entity.Djzt = "已审核";
entity.Shr = userId;
@@ -225,9 +231,13 @@ namespace NCC.Extend.WtTjd
foreach (var mx in mxList)
{
- await _db.Updateable()
- .SetColumns(it => new WtSpEntity { Lsj = mx.Thdj })
- .Where(it => it.Id == mx.Spbh)
+ var ckId = !string.IsNullOrEmpty(mx.Ck) ? mx.Ck : entity.Ck;
+ if (string.IsNullOrEmpty(ckId) || string.IsNullOrEmpty(mx.Spbh)) continue;
+
+ var thdj = mx.Thdj;
+ await _db.Updateable()
+ .SetColumns(it => new WtSpCostEntity { Cbj = thdj })
+ .Where(it => it.Spbh == mx.Spbh && it.Ck == ckId)
.ExecuteCommandAsync();
}
}
diff --git a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs
index dc56895..8461211 100644
--- a/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs
+++ b/Antis.Erp.Plat/netcore/src/Modularity/Extend/NCC.Extend/WtXsckdService.cs
@@ -64,6 +64,7 @@ namespace NCC.Extend.WtXsckd
private static bool _syPchColumnChecked;
private static bool _yddhColumnChecked;
private static bool _dyddhColumnChecked;
+ private static bool _fhrColumnChecked;
private static bool _spCostCkMigrated;
private static bool _salesReturnMxCostSnapshotMigrated;
private static int _salesReturnMxCostSnapshotRunCount;
@@ -391,6 +392,32 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
}
///
+ /// 确保发货人列 fhr 存在(抖音发货单提交销售出库时必填;独立于经手人)
+ ///
+ private void EnsureFhrColumn()
+ {
+ if (_fhrColumnChecked) return;
+ lock (typeof(WtXsckdService))
+ {
+ if (_fhrColumnChecked) return;
+ try
+ {
+ if (!_db.DbMaintenance.IsAnyTable("wt_xsckd")) { _fhrColumnChecked = true; return; }
+ var columns = _db.DbMaintenance.GetColumnInfosByTableName("wt_xsckd");
+ var columnNames = columns.Select(c => c.DbColumnName.ToLower()).ToHashSet();
+ if (!columnNames.Contains("fhr"))
+ {
+ _db.Ado.ExecuteCommand(
+ "ALTER TABLE `wt_xsckd` ADD COLUMN `fhr` varchar(64) NULL COMMENT '发货人(用户Id)'");
+ Console.WriteLine("✅ 已添加字段: fhr (发货人)");
+ }
+ }
+ catch (Exception ex) { Console.WriteLine($"EnsureFhrColumn: {ex.Message}"); }
+ _fhrColumnChecked = true;
+ }
+ }
+
+ ///
/// 确保付款明细列 fkmx 存在(会员余额/积分抵扣等 JSON)
///
private void EnsureFkmxColumn()
@@ -1721,6 +1748,7 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
EnsureSyPchColumn();
EnsureYddhColumn();
EnsureDyddhColumn();
+ EnsureFhrColumn();
MigrateSpCostCkToWarehouseId();
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
@@ -1930,8 +1958,9 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
EnsureSyPchColumn();
EnsureYddhColumn();
EnsureDyddhColumn();
+ EnsureFhrColumn();
EnsureBjsxColumn();
- var sidx = input.sidx == null ? "id" : input.sidx;
+ var sidx = string.IsNullOrWhiteSpace(input.sidx) ? "id" : input.sidx;
var ycddhFilter = string.IsNullOrWhiteSpace(input.ycddh) ? null : input.ycddh.Trim();
string linkedReturnExcludeDjlx = null;
var excludeConsignmentLinkedReturn = false;
@@ -2000,6 +2029,8 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
rkck = xsckd.Rkck,
// jsr=xsckd.Jsr,
jsr = SqlFunc.Subqueryable().Where(u => u.Id == xsckd.Jsr).Select(u => u.RealName),
+ // 发货人:存用户 Id,展示 RealName
+ fhr = SqlFunc.Subqueryable().Where(u => u.Id == xsckd.Fhr).Select(u => u.RealName),
ydje = xsckd.Ydje,
cbje = xsckd.Cbje,
bjsx = xsckd.Bjsx,
@@ -2027,7 +2058,9 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
ly = xsckd.Ly,
ycddh = xsckd.Ycddh,
ytwtfhd = xsckd.YtWtfhd,
- sy_pch = xsckd.SyPch
+ sy_pch = xsckd.SyPch,
+ yddh = xsckd.Yddh,
+ dyddh = xsckd.Dyddh
}).MergeTable()
// ycddh 条件放在 MergeTable 之后:Join+Select 子查询路径上部分 Where 在分页前未正确生效
.WhereIF(!string.IsNullOrEmpty(ycddhFilter), it =>
@@ -2182,7 +2215,11 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
private async Task EnrichListOutputGysWldwDisplayAsync(List items)
{
if (items == null || items.Count == 0) return;
- var targets = items.Where(x => x.djlx == "采购入库单" || x.djlx == "采购退货单").ToList();
+ var targets = items.Where(x =>
+ {
+ var lx = (x.djlx ?? string.Empty).Trim();
+ return lx == "采购入库单" || lx == "采购退货单";
+ }).ToList();
if (targets.Count == 0) return;
var billIds = targets.Select(x => x.id).Where(id => !string.IsNullOrEmpty(id)).Select(id => id.Trim()).Distinct().ToList();
if (billIds.Count == 0) return;
@@ -2207,6 +2244,24 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
.Where(x => !string.IsNullOrEmpty(x.Id))
.ToDictionary(x => x.Id.Trim(), x => x.Dwmc ?? "", StringComparer.Ordinal);
+ var unresolvedForLegacyGys = rawGysIds
+ .Where(k => !wldwDwmcById.TryGetValue(k, out var mc) || string.IsNullOrWhiteSpace(mc))
+ .Distinct()
+ .ToList();
+ Dictionary gysMcById = new Dictionary(StringComparer.Ordinal);
+ if (unresolvedForLegacyGys.Count > 0)
+ {
+ var legacyRows = await _db.Queryable()
+ .Where(g => unresolvedForLegacyGys.Contains(g.Id))
+ .Select(g => new { g.Id, g.Gysmc })
+ .ToListAsync();
+ foreach (var r in legacyRows)
+ {
+ if (string.IsNullOrEmpty(r.Id) || string.IsNullOrWhiteSpace(r.Gysmc)) continue;
+ gysMcById[r.Id.Trim()] = r.Gysmc.Trim();
+ }
+ }
+
foreach (var row in targets)
{
var bid = row.id?.Trim();
@@ -2215,6 +2270,10 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
var key = rawGys.Trim();
if (wldwDwmcById.TryGetValue(key, out var dwmc) && !string.IsNullOrWhiteSpace(dwmc))
row.gys = dwmc.Trim();
+ else if (gysMcById.TryGetValue(key, out var gysmc) && !string.IsNullOrWhiteSpace(gysmc))
+ row.gys = gysmc;
+ else
+ row.gys = key;
}
}
@@ -2341,7 +2400,7 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
jsrLookup = entity.Zdr;
}
- var ids = new[] { jsrLookup, entity.Zdr, entity.Shr, entity.Gzr }
+ var ids = new[] { jsrLookup, entity.Zdr, entity.Shr, entity.Gzr, entity.Fhr }
.Where(s => !string.IsNullOrWhiteSpace(s))
.Select(s => s.Trim())
.Distinct()
@@ -2389,6 +2448,8 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
await TrySetNameAsync(entity.Zdr, v => output.zdr = v);
await TrySetNameAsync(entity.Shr, v => output.shr = v);
await TrySetNameAsync(entity.Gzr, v => output.gzr = v);
+ // 发货人:抖音单传入的是用户 Id,这里转 RealName;不允许 hy 兜底,避免误把会员名作发货人
+ await TrySetNameAsync(entity.Fhr, v => output.fhr = v, allowHyFallback: false);
}
///
@@ -2536,6 +2597,7 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
EnsureSyPchColumn();
EnsureYddhColumn();
EnsureDyddhColumn();
+ EnsureFhrColumn();
EnsureBjsxColumn();
EnsureBjhcbColumn();
// 匿名访问时,userInfo可能为null,需要安全处理
@@ -3029,8 +3091,9 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
EnsureSyPchColumn();
EnsureYddhColumn();
EnsureDyddhColumn();
+ EnsureFhrColumn();
EnsureBjsxColumn();
- var sidx = input.sidx == null ? "id" : input.sidx;
+ var sidx = string.IsNullOrWhiteSpace(input.sidx) ? "id" : input.sidx;
var ycddhFilterNp = string.IsNullOrWhiteSpace(input.ycddh) ? null : input.ycddh.Trim();
List queryDjrq = input.djrq != null ? input.djrq.Split(',').ToObeject>() : null;
DateTime? startDjrq = queryDjrq != null ? Ext.GetDateTime(queryDjrq.First()) : null;
@@ -3079,6 +3142,7 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
cjck = xsckd.Cjck,
rkck = xsckd.Rkck,
jsr = SqlFunc.Subqueryable().Where(u => u.Id == xsckd.Jsr).Select(u => u.RealName),
+ fhr = SqlFunc.Subqueryable().Where(u => u.Id == xsckd.Fhr).Select(u => u.RealName),
ydje = xsckd.Ydje,
cbje = xsckd.Cbje,
bjsx = xsckd.Bjsx,
@@ -3099,7 +3163,9 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
ly = xsckd.Ly,
ycddh = xsckd.Ycddh,
ytwtfhd = xsckd.YtWtfhd,
- sy_pch = xsckd.SyPch
+ sy_pch = xsckd.SyPch,
+ yddh = xsckd.Yddh,
+ dyddh = xsckd.Dyddh
}).MergeTable()
.WhereIF(!string.IsNullOrEmpty(ycddhFilterNp), it =>
it.ycddh == ycddhFilterNp
@@ -3304,6 +3370,7 @@ WHERE d.djlx IN ('销售退货单','预售退货单','委托代销退货单')
EnsureSyPchColumn();
EnsureYddhColumn();
EnsureDyddhColumn();
+ EnsureFhrColumn();
EnsureBjsxColumn();
EnsureBjhcbColumn();
var oldHeader = await _db.Queryable().FirstAsync(p => p.Id == id);
@@ -5284,8 +5351,24 @@ LIMIT {offset}, {pageSize}";
return new { serialNumbers = new List