| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316 |
- using Admin.NET.Plugin.AiDOP.ProcurementExecution.Dto;
- using Admin.NET.Plugin.AiDOP.ProcurementExecution.Entity;
- using Yitter.IdGenerator;
- namespace Admin.NET.Plugin.AiDOP.ProcurementExecution;
- /// <summary>
- /// S4 供应商发货单(列表 + 表单)
- /// </summary>
- [ApiDescriptionSettings(Order = 321, Description = "S4供应商发货单")]
- [Route("api/ProcurementExecution")]
- [AllowAnonymous]
- [NonUnify]
- public class SupplierShipmentService : IDynamicApiController, ITransient
- {
- private readonly ISqlSugarClient _db;
- private readonly SqlSugarRepository<ScmShd> _masterRep;
- private readonly SqlSugarRepository<ScmShdzb> _detailRep;
- private readonly UserManager _userManager;
- private const int ShpcSerialWidth = 3; // yyMMdd + 3位流水:260508001
- private const int LabelXhStart = 10001;
- public SupplierShipmentService(
- ISqlSugarClient db,
- SqlSugarRepository<ScmShd> masterRep,
- SqlSugarRepository<ScmShdzb> detailRep,
- UserManager userManager)
- {
- _db = db;
- _masterRep = masterRep;
- _detailRep = detailRep;
- _userManager = userManager;
- }
- [DisplayName("供应商发货单列表")]
- [HttpGet("supplier-shipment/list")]
- public async Task<object> GetList([FromQuery] SupplierShipmentListInput input)
- {
- var pars = new List<SugarParameter>();
- var conditions = new List<string> { "IFNULL(m.state, 1) <> 0" };
- if (!string.IsNullOrWhiteSpace(input.JhshrqFrom))
- {
- conditions.Add("m.jhshrq >= @jhshrqFrom");
- pars.Add(new SugarParameter("@jhshrqFrom", input.JhshrqFrom.Trim()));
- }
- if (!string.IsNullOrWhiteSpace(input.Gysmc))
- {
- conditions.Add("m.sh_purchase_name LIKE @gysmc");
- pars.Add(new SugarParameter("@gysmc", $"%{input.Gysmc.Trim()}%"));
- }
- if (!string.IsNullOrWhiteSpace(input.Shddh))
- {
- conditions.Add("m.shddh LIKE @shddh");
- pars.Add(new SugarParameter("@shddh", $"%{input.Shddh.Trim()}%"));
- }
- if (!string.IsNullOrWhiteSpace(input.Wldh))
- {
- conditions.Add("m.wldh LIKE @wldh");
- pars.Add(new SugarParameter("@wldh", $"%{input.Wldh.Trim()}%"));
- }
- if (!string.IsNullOrWhiteSpace(input.PoBill))
- {
- conditions.Add("m.po_bill LIKE @poBill");
- pars.Add(new SugarParameter("@poBill", $"%{input.PoBill.Trim()}%"));
- }
- if (!string.IsNullOrWhiteSpace(input.ShMaterialCode))
- {
- conditions.Add("m.sh_material_code LIKE @shMaterialCode");
- pars.Add(new SugarParameter("@shMaterialCode", $"%{input.ShMaterialCode.Trim()}%"));
- }
- if (!string.IsNullOrWhiteSpace(input.Shzt))
- {
- conditions.Add("m.shzt = @shzt");
- pars.Add(new SugarParameter("@shzt", input.Shzt.Trim()));
- }
- if (!string.IsNullOrWhiteSpace(input.Shpc))
- {
- conditions.Add("m.shpc LIKE @shpc");
- pars.Add(new SugarParameter("@shpc", $"%{input.Shpc.Trim()}%"));
- }
- var where = $" WHERE {string.Join(" AND ", conditions)} ";
- var orderBy = BuildListOrderBy(input.SortField, input.SortOrder);
- var offset = (input.Page - 1) * input.PageSize;
- var wrapped = $"{BuildListSql()} {where}";
- var total = await _db.Ado.GetIntAsync($"SELECT COUNT(*) FROM ({wrapped}) t", pars);
- var list = await _db.Ado.SqlQueryAsync<SupplierShipmentListRow>(
- $"SELECT * FROM ({wrapped}) t {orderBy} LIMIT {input.PageSize} OFFSET {offset}", pars);
- return new { total, page = input.Page, pageSize = input.PageSize, list };
- }
- [DisplayName("获取发货单详情")]
- [HttpGet("supplier-shipment/{id:long}")]
- public async Task<object> GetDetail(long id)
- {
- var master = await _masterRep.GetFirstAsync(x => x.Id == id) ?? throw Oops.Oh("发货单不存在");
- var details = await _detailRep.AsQueryable().Where(x => x.Glid == id.ToString()).OrderBy(x => x.Hh).ToListAsync();
- return new
- {
- id = master.Id,
- shddh = master.Shddh,
- jhshrq = master.Jhshrq,
- wlsc = master.Wlsc,
- yjdhrq = master.Yjdhrq,
- shPurchaseName = master.ShPurchaseName,
- shPurchaseNum = master.ShPurchaseNum,
- wldh = master.Wldh,
- sfpc = master.Sfpc ?? 0,
- chbg = master.Chbg,
- pcsm = master.Pcsm,
- state = master.State ?? 1,
- details = details.Select(d => new
- {
- id = d.Id,
- hh = d.Hh,
- poBill = d.PoBill,
- poBillLine = d.PoBillLine,
- orderType = d.OrderType,
- shMaterialCode = d.ShMaterialCode,
- shMaterialName = d.ShMaterialName,
- th = d.Th,
- shDeliveryQuantity = d.ShDeliveryQuantity,
- bzsl = d.Bzsl,
- bqsl = d.Bqsl,
- shMaterialDw = d.ShMaterialDw,
- scrq = d.Scrq,
- scph = d.Scph,
- remarks = d.Remarks,
- djsl = d.Djsl,
- jybb = d.Jybb,
- jhdbh = d.Jhdbh
- })
- };
- }
- [DisplayName("发货单新增草稿")]
- [HttpGet("supplier-shipment/create-draft")]
- public async Task<object> GetCreateDraft([FromQuery] string ids)
- {
- var pars = new List<SugarParameter> { new("@ids", ids) };
- var rows = await _db.Ado.SqlQueryAsync<SupplierShipmentDraftRow>(
- """
- SELECT
- CAST(IFNULL(ds.id, p.RecID) AS CHAR(50)) AS sourceId,
- ds.suppliercode AS gysdm,
- ds.supplier AS gysmc,
- p.PurOrd AS poBill,
- p.Line AS poBillLine,
- p.Potype AS orderType,
- p.ItemNum AS shMaterialCode,
- im.Descr AS shMaterialName,
- IFNULL(im.Drawing, p.Drawing) AS th,
- IFNULL(ds.SchedQty, p.QtyOrded - p.RctQty - p.ReceiptQty + p.QtyReturned) AS shDeliveryQuantity,
- p.StdPackQty AS bzsl,
- CASE
- WHEN IFNULL(p.StdPackQty, 0) > 0 THEN CEILING(IFNULL(ds.SchedQty, p.QtyOrded - p.RctQty - p.ReceiptQty + p.QtyReturned) / p.StdPackQty)
- ELSE 0
- END AS bqsl,
- p.UM AS shMaterialDw,
- (p.QtyOrded - p.RctQty - p.ReceiptQty + p.QtyReturned) AS djsl,
- ds.DSNum AS jhdbh,
- im.Descr1 AS shMaterialGgxh
- FROM PurOrdDetail p
- LEFT JOIN srm_polist_ds ds ON p.PurOrd = ds.ponumber AND p.Line = ds.poline
- LEFT JOIN ItemMaster im ON p.ItemNum = im.ItemNum
- WHERE FIND_IN_SET(CAST(IFNULL(ds.id, p.RecID) AS CHAR(50)), REPLACE(IFNULL(@ids, ''), ' ', '')) > 0
- ORDER BY p.PurOrd, p.Line
- """, pars);
- if (rows.Count == 0)
- throw Oops.Oh("未找到可生成的交货明细");
- return new
- {
- shddh = string.Empty,
- jhshrq = DateTime.Now.ToString("yyyy-MM-dd"),
- wlsc = string.Empty,
- yjdhrq = string.Empty,
- shPurchaseName = rows[0].Gysmc,
- shPurchaseNum = rows[0].Gysdm,
- wldh = string.Empty,
- sfpc = 0,
- chbg = string.Empty,
- pcsm = string.Empty,
- details = rows.Select((r, i) => new
- {
- id = (long?)null,
- hh = i + 1,
- poBill = r.PoBill,
- poBillLine = r.PoBillLine?.ToString(),
- orderType = r.OrderType,
- shMaterialCode = r.ShMaterialCode,
- shMaterialName = r.ShMaterialName,
- th = r.Th,
- shDeliveryQuantity = r.ShDeliveryQuantity,
- bzsl = r.Bzsl,
- bqsl = r.Bqsl ?? 0,
- shMaterialDw = r.ShMaterialDw,
- scrq = string.Empty,
- scph = string.Empty,
- remarks = string.Empty,
- djsl = r.Djsl,
- jybb = string.Empty,
- jhdbh = r.Jhdbh
- })
- };
- }
- [DisplayName("保存发货单")]
- [ApiDescriptionSettings(Name = "SaveSupplierShipment"), HttpPost("supplier-shipment/save")]
- public async Task<object> Save([FromBody] SupplierShipmentSaveInput input)
- {
- var now = DateTime.Now;
- var userId = _userManager.UserId.ToString();
- var userName = _userManager.Account ?? "system";
- var shipDate = string.IsNullOrWhiteSpace(input.Jhshrq) ? now.ToString("yyyy-MM-dd") : input.Jhshrq!.Trim();
- if (input.Id is null or 0)
- {
- var newId = YitIdHelper.NextId();
- var shddh = await AllocateShddhAsync(input.ShPurchaseNum ?? string.Empty);
- var entity = new ScmShd
- {
- Id = newId,
- Shddh = shddh,
- Jhshrq = shipDate,
- Wlsc = input.Wlsc,
- Yjdhrq = input.Yjdhrq,
- ShPurchaseName = input.ShPurchaseName,
- ShPurchaseNum = input.ShPurchaseNum,
- Wldh = input.Wldh,
- Sfpc = input.Sfpc ?? 0,
- Chbg = input.Chbg,
- Pcsm = input.Pcsm,
- State = 1,
- Shzt = "待收",
- Tjrid = userId,
- Tjrxm = userName,
- Tjrq = now.ToString("yyyy-MM-dd")
- };
- await _masterRep.InsertAsync(entity);
- await SaveDetailsAsync(newId, input.Details);
- return new { id = newId, message = "新增成功", shddh = entity.Shddh };
- }
- var master = await _masterRep.GetFirstAsync(x => x.Id == input.Id.Value) ?? throw Oops.Oh("发货单不存在");
- master.Jhshrq = shipDate;
- master.Wlsc = input.Wlsc;
- master.Yjdhrq = input.Yjdhrq;
- master.ShPurchaseName = input.ShPurchaseName;
- master.ShPurchaseNum = input.ShPurchaseNum;
- master.Wldh = input.Wldh;
- master.Sfpc = input.Sfpc ?? 0;
- master.Chbg = input.Chbg;
- master.Pcsm = input.Pcsm;
- await _masterRep.UpdateAsync(master);
- await SaveDetailsAsync(input.Id.Value, input.Details);
- return new { id = input.Id, message = "编辑成功", shddh = master.Shddh };
- }
- [DisplayName("删除发货单")]
- [ApiDescriptionSettings(Name = "DeleteSupplierShipment"), HttpPost("supplier-shipment/delete")]
- public async Task<object> Delete([FromBody] SupplierShipmentDeleteInput input)
- {
- var master = await _masterRep.GetFirstAsync(x => x.Id == input.Id) ?? throw Oops.Oh("发货单不存在");
- master.State = 0;
- await _masterRep.UpdateAsync(master);
- return new { message = "删除成功" };
- }
- [DisplayName("生成标签(预留)")]
- [HttpPost("supplier-shipment/generate-label")]
- public async Task<object> GenerateLabel([FromBody] SupplierShipmentOperationInput input)
- {
- if (input.Id <= 0)
- throw Oops.Oh("缺少发货单ID(id)");
- var userName = _userManager.Account ?? "system";
- var master = await _masterRep.GetFirstAsync(x => x.Id == input.Id) ?? throw Oops.Oh("发货单不存在");
- if (string.IsNullOrWhiteSpace(master.Shddh))
- throw Oops.Oh("发货单缺少发货单编号(shddh)");
- var shddh = master.Shddh.Trim();
- var gysmc = master.ShPurchaseName ?? string.Empty;
- var gysdm = master.ShPurchaseNum ?? string.Empty;
- // Domain(工厂编码)
- var domain = await _db.Ado.GetStringAsync(
- "SELECT Domain FROM GeneralizedCodeMaster WHERE FldName='SystemConfig' AND Val='CompanyCode' LIMIT 1");
- domain = string.IsNullOrWhiteSpace(domain) ? string.Empty : domain.Trim();
- string? lockKey = null;
- try
- {
- var tran = await _db.Ado.UseTranAsync(async () =>
- {
- // 1) 归档旧标签
- await _db.Ado.ExecuteCommandAsync(
- """
- INSERT INTO scm_shbqhis
- (glid, sh_material_code, sh_material_name, sh_material_ggxh, sh_delivery_quantity,
- sh_material_dw, remarks, bzsl, order_type, po_billno, shdh, shdhh, scrq, scph, xh,
- gysdm, gysmc, po_billline, bbh, th, yt, ccrq, shpc, jhdbh, jhdhh)
- SELECT
- glid, sh_material_code, sh_material_name, sh_material_ggxh, sh_delivery_quantity,
- sh_material_dw, remarks, bzsl, order_type, po_billno, shdh, shdhh, scrq, scph, xh,
- gysdm, gysmc, po_billline, bbh, th, yt, ccrq, shpc, jhdbh, jhdhh
- FROM scm_shbq WHERE shdh=@shdh;
- """,
- new List<SugarParameter> { new("@shdh", shddh) });
- await _db.Ado.ExecuteCommandAsync(
- "DELETE FROM scm_shbq WHERE shdh=@shdh",
- new List<SugarParameter> { new("@shdh", shddh) });
- // 2) 需要补 shpc 的明细(按物料+供应商批号去重)
- var needShpc = await _db.Ado.SqlQueryAsync<NeedShpcRow>(
- """
- SELECT DISTINCT
- b.sh_material_code AS wlbm,
- IFNULL(b.scph, '') AS scph
- FROM scm_shd a
- INNER JOIN scm_shdzb b ON CAST(a.id AS CHAR) = b.glid
- WHERE a.shddh = @shddh
- AND IFNULL(b.sh_material_code, '') <> ''
- AND IFNULL(b.shpc, '') = '';
- """,
- new List<SugarParameter> { new("@shddh", shddh) });
- if (needShpc.Count > 0)
- {
- // 并发安全:按天加锁 + 取最大流水 + 批量生成
- var prefix = DateTime.Now.ToString("yyMMdd");
- lockKey = $"scm_shpc_seq_{prefix}";
- await AcquireMySqlLockAsync(lockKey, 10);
- var nextSerial = await GetNextDailySerialAsync(prefix, domain);
- var pairs = needShpc
- .OrderBy(x => x.Wlbm ?? string.Empty)
- .ThenBy(x => x.Scph ?? string.Empty)
- .Select((x, idx) => new
- {
- x.Wlbm,
- x.Scph,
- Shpc = $"{prefix}{(nextSerial + idx).ToString().PadLeft(ShpcSerialWidth, '0')}"
- })
- .ToList();
- // 更新 scm_shdzb.shpc(同一发货单下:物料+供应商批号相同的行统一批次号)
- foreach (var p in pairs)
- {
- await _db.Ado.ExecuteCommandAsync(
- """
- UPDATE scm_shdzb b
- INNER JOIN scm_shd a ON CAST(a.id AS CHAR) = b.glid
- SET b.shpc = @shpc
- WHERE a.shddh = @shddh
- AND b.sh_material_code = @wlbm
- AND IFNULL(b.scph, '') = IFNULL(@scph, '')
- AND IFNULL(b.shpc, '') = '';
- """,
- new List<SugarParameter>
- {
- new("@shpc", p.Shpc),
- new("@shddh", shddh),
- new("@wlbm", p.Wlbm ?? string.Empty),
- new("@scph", p.Scph ?? string.Empty),
- });
- }
- // 兼容:如果线上存在 scm_shdshph,则同步写入(仓库脚本里未包含该表)
- var shdshphExists = await TableExistsAsync("scm_shdshph");
- if (shdshphExists)
- {
- foreach (var p in pairs)
- {
- await _db.Ado.ExecuteCommandAsync(
- """
- INSERT INTO scm_shdshph (shpc, wlbm, scph, shdh, xh, gysbm, csrq)
- SELECT @shpc, @wlbm, @scph, @shdh, @xh, @gysdm, NOW()
- FROM DUAL
- WHERE NOT EXISTS (
- SELECT 1 FROM scm_shdshph
- WHERE shdh=@shdh AND wlbm=@wlbm AND IFNULL(scph,'')=IFNULL(@scph,'')
- );
- """,
- new List<SugarParameter>
- {
- new("@shpc", p.Shpc),
- new("@wlbm", p.Wlbm ?? string.Empty),
- new("@scph", p.Scph ?? string.Empty),
- new("@shdh", shddh),
- new("@xh", p.Shpc),
- new("@gysdm", gysdm),
- });
- }
- }
- // 推进 NbrControl.NextValue,确保续号(仅当没有历史 shpc 且使用了 NbrControl 作为起点时也能正确续)
- // 这里直接推进到“本批次最后一个流水号”,下次取号将从 NextValue+1 开始。
- var lastSerial = nextSerial + pairs.Count - 1;
- await BumpNbrControlNextValueAsync(domain, lastSerial);
- }
- // 3) 补 jhdhh(同一发货单:为空的明细按 id 递增,起始 max(jhdhh) or 1000)
- var shdid = await _db.Ado.GetLongAsync(
- "SELECT id FROM scm_shd WHERE shddh=@shddh LIMIT 1",
- new List<SugarParameter> { new("@shddh", shddh) });
- var startNo = await _db.Ado.GetIntAsync(
- "SELECT IFNULL(MAX(CAST(IFNULL(jhdhh,'') AS SIGNED)), 1000) FROM scm_shdzb WHERE glid=@glid",
- new List<SugarParameter> { new("@glid", shdid.ToString()) });
- var jhdhhNeed = await _db.Ado.SqlQueryAsync<IdOnlyRow>(
- "SELECT id FROM scm_shdzb WHERE glid=@glid AND IFNULL(jhdhh,'')='' ORDER BY id",
- new List<SugarParameter> { new("@glid", shdid.ToString()) });
- var seq = startNo;
- foreach (var r in jhdhhNeed)
- {
- seq++;
- await _db.Ado.ExecuteCommandAsync(
- "UPDATE scm_shdzb SET jhdhh=@jhdhh WHERE id=@id",
- new List<SugarParameter>
- {
- new("@jhdhh", seq.ToString()),
- new("@id", r.Id)
- });
- }
- // 4) 生成 scm_shbq(按 bqsl 拆分;每箱 bzsl,最后一箱余数)
- var sourceRows = await _db.Ado.SqlQueryAsync<LabelSourceRow>(
- """
- SELECT
- a.shddh AS shddh,
- b.id AS detailId,
- b.glid AS glid,
- b.sh_material_code AS wlbm,
- b.sh_material_name AS wlmc,
- b.sh_material_ggxh AS ggxh,
- b.sh_delivery_quantity AS shsl,
- b.sh_material_dw AS dw,
- b.remarks AS bz,
- b.bzsl AS bzsl,
- b.bqsl AS bqsl,
- b.order_type AS ddlx,
- b.po_bill AS ddh,
- CAST(IFNULL(b.po_billline, '0') AS SIGNED) AS po_billline,
- b.hh AS hh,
- b.scrq AS scrq,
- b.scph AS scph,
- IFNULL(im.Drawing, pd.Drawing) AS th,
- IFNULL(im.Rev, pd.Rev) AS bbh,
- a.sh_purchase_name AS gysmc,
- a.sh_purchase_num AS gysdm,
- pm.`Usage` AS po_usage,
- b.ccrq AS ccrq,
- a.jhshrq AS jhshrq,
- b.jhdbh AS jhdbh,
- b.jhdhh AS jhdhh,
- b.shpc AS shpc
- FROM scm_shd a
- INNER JOIN scm_shdzb b ON CAST(a.id AS CHAR) = b.glid
- LEFT JOIN PurOrdMaster pm ON pm.PurOrd = b.po_bill
- LEFT JOIN PurOrdDetail pd ON pd.PurOrd = b.po_bill AND pd.Line = b.po_billline
- LEFT JOIN ItemMaster im ON im.ItemNum = b.sh_material_code
- WHERE a.shddh = @shddh;
- """,
- new List<SugarParameter> { new("@shddh", shddh) });
- foreach (var row in sourceRows)
- {
- var totalQty = row.Shsl ?? 0m;
- var packQty = row.Bzsl ?? 0m;
- var labelCnt = (int)Math.Max(0, row.Bqsl ?? 0m);
- if (totalQty <= 0 || labelCnt <= 0)
- continue;
- var xh = LabelXhStart;
- var remainQty = totalQty;
- var remainLabels = labelCnt;
- // 多箱:前 N-1 箱按包装数量
- while (remainLabels > 1)
- {
- await InsertLabelAsync(shddh, row, packQty, xh, gysdm, gysmc);
- remainQty -= packQty;
- remainLabels--;
- xh++;
- }
- if (remainQty > 0)
- {
- await InsertLabelAsync(shddh, row, remainQty, xh, gysdm, gysmc);
- }
- }
- // 5) 更新发货单状态
- await _db.Ado.ExecuteCommandAsync(
- "UPDATE scm_shd SET shzt='待收', state=2, dycs=0 WHERE shddh=@shddh",
- new List<SugarParameter> { new("@shddh", shddh) });
- // 6) MissedPrint:作废旧未打印(U)
- await _db.Ado.ExecuteCommandAsync(
- """
- UPDATE MissedPrint SET
- PurOrd = CONCAT('作废_', IFNULL(PurOrd, '')),
- BarCode = CONCAT(CAST(RecID AS CHAR(20)), '_', IFNULL(BarCode, '')),
- Status = 'C',
- RelatedBarCode = '',
- UpdateTime = NOW(),
- UpdateUser = @u
- WHERE Domain = @domain
- AND ShipperNbr = @shddh
- AND Status = 'U';
- """,
- new List<SugarParameter>
- {
- new("@u", userName),
- new("@domain", domain),
- new("@shddh", shddh),
- });
- // 7) MissedPrint:插入待打印(U)
- await _db.Ado.ExecuteCommandAsync(
- """
- INSERT INTO MissedPrint
- (
- Domain, Site, PrintTime,
- ItemNum, Descr, Product, Carton, OrdNbr,
- PackingQty, Qty, Location, Status,
- Supply, LotSerial, CartonQty, BarCode,
- MoldNum, SuppLotSerial, ShipperNbr, ShipperLine,
- ProdDate, PurOrd, PurLine, PurQty, WorkOrd,
- LabelFormat, StandItem, EffSize, GP12CheckedQty, NetWeight,
- Remark, CreateTime, UpdateTime, CreateUser, UpdateUser,
- LevelChar, PurOrdDetBatchNbr, FirmString5, ExpireDate,
- Printer, Company, Checker, Position
- )
- SELECT
- @domain AS Domain,
- @domain AS Site,
- NULL AS PrintTime,
- s.sh_material_code AS ItemNum,
- s.sh_material_name AS Descr,
- s.sh_material_ggxh AS Product,
- RIGHT(s.xh, 4) AS Carton,
- s.po_billno AS OrdNbr,
- s.bzsl AS PackingQty,
- s.sh_delivery_quantity AS Qty,
- NULL AS Location,
- 'U' AS Status,
- s.gysdm AS Supply,
- s.shpc AS LotSerial,
- 1 AS CartonQty,
- s.xh AS BarCode,
- NULL AS MoldNum,
- s.scph AS SuppLotSerial,
- s.shdh AS ShipperNbr,
- s.shdhh AS ShipperLine,
- STR_TO_DATE(s.scrq, '%Y-%m-%d') AS ProdDate,
- s.po_billno AS PurOrd,
- s.po_billline AS PurLine,
- s.sh_delivery_quantity AS PurQty,
- NULL AS WorkOrd,
- 'cl01' AS LabelFormat,
- s.po_billno AS StandItem,
- s.po_billline AS EffSize,
- s.sh_delivery_quantity AS GP12CheckedQty,
- 0 AS NetWeight,
- s.remarks AS Remark,
- NOW() AS CreateTime,
- NOW() AS UpdateTime,
- @u AS CreateUser,
- @u AS UpdateUser,
- s.bbh AS LevelChar,
- s.jhdbh AS PurOrdDetBatchNbr,
- p.ActiveRlseID1 AS FirmString5,
- CASE
- WHEN i.SuppWarranty = 1 THEN
- CASE
- WHEN UPPER(i.WarrantyCode)='D' THEN DATE_ADD(STR_TO_DATE(s.scrq, '%Y-%m-%d'), INTERVAL IFNULL(i.DaysBetweenPM,0) DAY)
- WHEN UPPER(i.WarrantyCode)='Y' THEN DATE_ADD(STR_TO_DATE(s.scrq, '%Y-%m-%d'), INTERVAL IFNULL(i.DaysBetweenPM,0) YEAR)
- WHEN UPPER(i.WarrantyCode)='M' THEN DATE_ADD(STR_TO_DATE(s.scrq, '%Y-%m-%d'), INTERVAL IFNULL(i.DaysBetweenPM,0) MONTH)
- ELSE DATE_ADD(STR_TO_DATE(s.scrq, '%Y-%m-%d'), INTERVAL IFNULL(i.DaysBetweenPM,0) DAY)
- END
- ELSE NULL
- END AS ExpireDate,
- '' AS Printer,
- '' AS Company,
- '' AS Checker,
- '' AS Position
- FROM scm_shbq s
- LEFT JOIN PurOrdDetail p ON p.PurOrd = s.po_billno AND p.Line = s.po_billline
- LEFT JOIN ItemMaster i ON i.ItemNum = s.sh_material_code
- WHERE s.shdh = @shddh;
- """,
- new List<SugarParameter>
- {
- new("@domain", domain),
- new("@u", userName),
- new("@shddh", shddh),
- });
- });
- if (!tran.IsSuccess)
- {
- var msg = $"生成标签失败,{tran.ErrorMessage}";
- return new { success = false, msg, message = msg };
- }
- var ok = "生成标签成功!";
- return new { success = true, msg = ok, message = ok };
- }
- finally
- {
- if (!string.IsNullOrWhiteSpace(lockKey))
- {
- await ReleaseMySqlLockAsync(lockKey);
- }
- }
- }
- private async Task InsertLabelAsync(string shddh, LabelSourceRow row, decimal qty, int xh, string gysdm, string gysmc)
- {
- var jhdhh3 = Right(row.Jhdhh, 3);
- var xh4 = Right(xh.ToString(), 4);
- var bar = $"{shddh}{jhdhh3}{xh4}";
- await _db.Ado.ExecuteCommandAsync(
- """
- INSERT INTO scm_shbq
- (glid, sh_material_code, sh_material_name, sh_material_ggxh, sh_delivery_quantity,
- sh_material_dw, remarks, bzsl, order_type, po_billno, shdh, shdhh, scrq, scph, xh,
- gysdm, gysmc, po_billline, bbh, th, yt, ccrq, shpc, jhdbh, jhdhh)
- VALUES
- (@glid, @wlbm, @wlmc, @ggxh, @qty,
- @dw, @bz, @bzsl, @ddlx, @ddh, @shdh, @hh, @scrq, @scph, @xh,
- @gysdm, @gysmc, @pohh, @bbh, @th, @yt, @ccrq, @shpc, @jhdbh, @jhdhh);
- """,
- new List<SugarParameter>
- {
- new("@glid", row.DetailId),
- new("@wlbm", row.Wlbm ?? string.Empty),
- new("@wlmc", row.Wlmc ?? string.Empty),
- new("@ggxh", row.Ggxh ?? string.Empty),
- new("@qty", qty),
- new("@dw", row.Dw ?? string.Empty),
- new("@bz", row.Bz ?? string.Empty),
- new("@bzsl", row.Bzsl ?? 0m),
- new("@ddlx", row.Ddlx ?? string.Empty),
- new("@ddh", row.Ddh ?? string.Empty),
- new("@shdh", shddh),
- new("@hh", row.Hh ?? 0),
- new("@scrq", row.Scrq ?? string.Empty),
- new("@scph", row.Scph ?? string.Empty),
- new("@xh", bar),
- new("@gysdm", gysdm),
- new("@gysmc", gysmc),
- new("@pohh", row.PoBillLine ?? 0),
- new("@bbh", row.Bbh ?? string.Empty),
- new("@th", row.Th ?? string.Empty),
- new("@yt", row.PoUsage ?? string.Empty),
- new("@ccrq", row.Ccrq ?? string.Empty),
- new("@shpc", row.Shpc ?? string.Empty),
- new("@jhdbh", row.Jhdbh ?? string.Empty),
- new("@jhdhh", row.Jhdhh ?? string.Empty),
- });
- }
- private static string Right(string? s, int len)
- {
- if (string.IsNullOrEmpty(s)) return new string('0', len);
- var t = s.Trim();
- return t.Length <= len ? t.PadLeft(len, '0') : t[^len..];
- }
- private async Task AcquireMySqlLockAsync(string key, int timeoutSeconds)
- {
- var ok = await _db.Ado.GetIntAsync("SELECT GET_LOCK(@k, @t)", new List<SugarParameter>
- {
- new("@k", key),
- new("@t", timeoutSeconds),
- });
- if (ok != 1)
- throw Oops.Oh($"生成批次号锁等待超时({key})");
- }
- private Task ReleaseMySqlLockAsync(string key)
- => _db.Ado.ExecuteCommandAsync("SELECT RELEASE_LOCK(@k)", new List<SugarParameter> { new("@k", key) });
- /// <summary>
- /// 发货单号:供应商编码-yyyyMMdd-四位流水(同日同供应商递增,保存时分配)。
- /// </summary>
- private async Task<string> AllocateShddhAsync(string supplierCode)
- {
- var code = (supplierCode ?? string.Empty).Trim().Replace("-", string.Empty);
- if (string.IsNullOrEmpty(code))
- throw Oops.Oh("请先填写供应商编号,保存时将用于生成发货单号");
- var date = DateTime.Now.ToString("yyyyMMdd");
- var prefix = $"{code}-{date}-";
- if (prefix.Length > 240)
- throw Oops.Oh("供应商编码过长,无法生成发货单号");
- var lockKey = $"scm_shddh_{code}_{date}";
- if (lockKey.Length > 64)
- lockKey = lockKey[..64];
- await AcquireMySqlLockAsync(lockKey, 15);
- try
- {
- var maxSeq = await _db.Ado.GetIntAsync(
- """
- SELECT IFNULL(MAX(CAST(RIGHT(shddh, 4) AS UNSIGNED)), 0)
- FROM scm_shd
- WHERE shddh LIKE CONCAT(@pfx, '%')
- AND CHAR_LENGTH(shddh) = CHAR_LENGTH(@pfx) + 4
- AND RIGHT(shddh, 4) REGEXP '^[0-9]{4}$'
- """,
- new List<SugarParameter> { new("@pfx", prefix) });
- var next = maxSeq + 1;
- if (next > 9999)
- throw Oops.Oh("当日该供应商发货单流水号已超过 9999");
- return $"{prefix}{next:D4}";
- }
- finally
- {
- await ReleaseMySqlLockAsync(lockKey);
- }
- }
- private async Task<int> GetNextDailySerialAsync(string prefix, string domain)
- {
- // 从已存在的批次号中取当天最大流水:yyMMdd + 3位
- // 优先 scm_shdzb,其次 scm_shbq(兼容历史数据来源)
- var max1 = await _db.Ado.GetStringAsync(
- "SELECT MAX(shpc) FROM scm_shdzb WHERE shpc LIKE @pfx",
- new List<SugarParameter> { new("@pfx", $"{prefix}%") });
- var max2 = await _db.Ado.GetStringAsync(
- "SELECT MAX(shpc) FROM scm_shbq WHERE shpc LIKE @pfx",
- new List<SugarParameter> { new("@pfx", $"{prefix}%") });
- var max = string.CompareOrdinal(max1 ?? string.Empty, max2 ?? string.Empty) >= 0 ? max1 : max2;
- if (string.IsNullOrWhiteSpace(max) || max!.Length < prefix.Length + ShpcSerialWidth)
- {
- // 兜底:读取 NbrControl(NbrType='WoLot')的 NextValue + 1
- // 说明:有些环境可能会清理历史批次号表;此时用 NbrControl 保证连续。
- var nv = await _db.Ado.GetIntAsync(
- """
- SELECT IFNULL(NextValue, 0)
- FROM NbrControl
- WHERE NbrType='WoLot'
- AND (
- domain_code = @d
- OR Domain = @d
- OR IFNULL(@d,'') = ''
- )
- ORDER BY RecID
- LIMIT 1
- """,
- new List<SugarParameter> { new("@d", domain ?? string.Empty) });
- // 用户要求:NextValue+1 为下一流水号起点
- return Math.Max(1, nv + 1);
- }
- var suffix = max.Substring(prefix.Length);
- return int.TryParse(suffix, out var n) ? n + 1 : 1;
- }
- private async Task BumpNbrControlNextValueAsync(string domain, int lastSerial)
- {
- // 保守推进:仅当新值更大时更新,避免其它流程并发推进导致回退。
- await _db.Ado.ExecuteCommandAsync(
- """
- UPDATE NbrControl
- SET NextValue = CASE
- WHEN IFNULL(NextValue, 0) < @v THEN @v
- ELSE IFNULL(NextValue, 0)
- END,
- UpdateTime = NOW()
- WHERE NbrType = 'WoLot'
- AND (
- domain_code = @d
- OR Domain = @d
- OR IFNULL(@d,'') = ''
- );
- """,
- new List<SugarParameter>
- {
- new("@d", domain ?? string.Empty),
- new("@v", lastSerial),
- });
- }
- private async Task<bool> TableExistsAsync(string tableName)
- {
- var cnt = await _db.Ado.GetIntAsync(
- """
- SELECT COUNT(*)
- FROM information_schema.tables
- WHERE table_schema = DATABASE()
- AND table_name = @t
- """,
- new List<SugarParameter> { new("@t", tableName) });
- return cnt > 0;
- }
- private sealed class NeedShpcRow
- {
- public string? Wlbm { get; set; }
- public string? Scph { get; set; }
- }
- private sealed class IdOnlyRow
- {
- public long Id { get; set; }
- }
- private sealed class LabelSourceRow
- {
- public string? Shddh { get; set; }
- public long DetailId { get; set; }
- public string? Glid { get; set; }
- public string? Wlbm { get; set; }
- public string? Wlmc { get; set; }
- public string? Ggxh { get; set; }
- public decimal? Shsl { get; set; }
- public string? Dw { get; set; }
- public string? Bz { get; set; }
- public decimal? Bzsl { get; set; }
- public decimal? Bqsl { get; set; }
- public string? Ddlx { get; set; }
- public string? Ddh { get; set; }
- public int? PoBillLine { get; set; }
- public int? Hh { get; set; }
- public string? Scrq { get; set; }
- public string? Scph { get; set; }
- public string? Th { get; set; }
- public string? Bbh { get; set; }
- public string? PoUsage { get; set; }
- public string? Ccrq { get; set; }
- public string? Jhdbh { get; set; }
- public string? Jhdhh { get; set; }
- public string? Shpc { get; set; }
- }
- [DisplayName("送货单打印数据(模板:送货单)")]
- [HttpGet("supplier-shipment/shipping-note-data")]
- public async Task<object> GetShippingNotePrintData([FromQuery] string shddh)
- {
- if (string.IsNullOrWhiteSpace(shddh))
- throw Oops.Oh("缺少发货单编号(shddh)");
- var pars = new List<SugarParameter> { new("@shddh", shddh.Trim()) };
- const string masterSql = """
- SELECT
- id,
- sh_purchase_id,
- sh_purchase_name AS gysmc,
- sh_purchase_num AS gysdm,
- sh_purchase_address,
- sh_purchase_lxr,
- sh_purchase_phone,
- client,
- delivery_Address,
- expected_consignee,
- consignee_phone,
- estimated_delivery_date,
- po_billno,
- shddh,
- jhshrq,
- tjrid,
- tjrxm,
- tjrq,
- scbq,
- wlsc,
- yjdhrq,
- wldh,
- sfpc,
- pcsm,
- chbg
- FROM scm_shd
- WHERE shddh = @shddh
- LIMIT 1
- """;
- const string detailSql = """
- SELECT
- a.shddh,
- b.hh AS xh,
- b.po_bill AS ddbh,
- c.`Usage` AS ddlx,
- b.order_type AS lx1,
- b.sh_material_code AS wlbm,
- b.sh_material_name AS wlmc,
- b.sh_material_ggxh AS ggxh,
- b.sh_delivery_quantity AS shsl,
- b.sh_material_dw AS dw,
- b.remarks AS bz,
- b.scrq,
- b.scph,
- b.th
- FROM scm_shd a
- INNER JOIN scm_shdzb b ON CAST(a.id AS CHAR) = b.glid
- LEFT JOIN (
- SELECT
- i.Drawing AS th,
- d.Rev AS bbh,
- d.Line,
- p.PurOrd,
- p.`Usage`
- FROM PurOrdMaster p
- LEFT JOIN PurOrdDetail d ON p.Potype = d.Potype AND p.PurOrd = d.PurOrd
- LEFT JOIN ItemMaster i ON d.ItemNum = i.ItemNum
- WHERE p.IsActive = 1
- ) c ON c.PurOrd = b.po_bill AND CAST(c.Line AS CHAR) = TRIM(CAST(IFNULL(b.po_billline, '') AS CHAR))
- WHERE a.shddh = @shddh
- ORDER BY b.hh, b.id
- """;
- var masterRows = await _db.Ado.SqlQueryAsync<ShippingNoteMasterRow>(masterSql, pars);
- var master = masterRows.FirstOrDefault();
- if (master == null)
- throw Oops.Oh($"发货单不存在:{shddh}");
- var list = await _db.Ado.SqlQueryAsync<ShippingNoteDetailRow>(detailSql, pars);
- if (list.Count == 0)
- throw Oops.Oh($"发货单无明细,无法打印:{shddh}");
- return new
- {
- id = master.id,
- sh_purchase_id = master.sh_purchase_id,
- gysmc = master.gysmc,
- gysdm = master.gysdm,
- sh_purchase_address = master.sh_purchase_address,
- sh_purchase_lxr = master.sh_purchase_lxr,
- sh_purchase_phone = master.sh_purchase_phone,
- client = master.client,
- delivery_Address = master.delivery_Address,
- expected_consignee = master.expected_consignee,
- consignee_phone = master.consignee_phone,
- estimated_delivery_date = master.estimated_delivery_date,
- po_billno = master.po_billno,
- shddh = master.shddh,
- jhshrq = master.jhshrq,
- tjrid = master.tjrid,
- tjrxm = master.tjrxm,
- tjrq = master.tjrq,
- scbq = master.scbq,
- wlsc = master.wlsc,
- yjdhrq = master.yjdhrq,
- wldh = master.wldh,
- sfpc = master.sfpc,
- pcsm = master.pcsm,
- chbg = master.chbg,
- list,
- items = list,
- details = list,
- table = list
- };
- }
- [DisplayName("打印送货单(预留)")]
- [HttpPost("supplier-shipment/print-shipping-note")]
- public Task<object> PrintShippingNote([FromBody] SupplierShipmentOperationInput input)
- => Task.FromResult<object>(new { message = $"请使用 GET supplier-shipment/shipping-note-data 与打印模板「送货单」" });
- [DisplayName("打印标签(预留)")]
- [HttpPost("supplier-shipment/print-label")]
- public Task<object> PrintLabel([FromBody] SupplierShipmentOperationInput input)
- => Task.FromResult<object>(new { message = $"发货单{input.Id}:功能预留,暂未启用" });
- [DisplayName("发货单标签数据(scm_shbq)")]
- [HttpGet("supplier-shipment/label-data")]
- public async Task<object> GetLabelData([FromQuery] string shddh)
- {
- if (string.IsNullOrWhiteSpace(shddh))
- throw Oops.Oh("缺少发货单编号(shddh)");
- var pars = new List<SugarParameter> { new("@shddh", shddh.Trim()) };
- const string sql = """
- SELECT DISTINCT
- glid,
- sh_material_code AS wlbm,
- sh_material_name AS wlmc,
- CONCAT(IFNULL(sh_material_name, ''), IFNULL(sh_material_ggxh, '')) AS ggxh,
- sh_delivery_quantity AS zxsl,
- sh_material_dw AS dw,
- remarks,
- bzsl AS bz,
- order_type AS ddlx,
- po_billno AS ddh,
- shdh AS shdh,
- shdhh AS shdhh,
- scrq,
- scph,
- xh,
- gysmc,
- th,
- bbh,
- yt,
- ccrq,
- shpc
- FROM scm_shbq
- WHERE shdh = @shddh
- """;
- var list = await _db.Ado.SqlQueryAsync<SupplierShipmentLabelRow>(sql, pars);
- return new { list };
- }
- private async Task SaveDetailsAsync(long masterId, List<SupplierShipmentDetailInput> inputDetails)
- {
- var dbDetails = await _detailRep.AsQueryable().Where(x => x.Glid == masterId.ToString()).ToListAsync();
- var dbById = dbDetails.ToDictionary(x => x.Id);
- var inputIds = new HashSet<long>(inputDetails.Where(d => d.Id is > 0).Select(d => d.Id!.Value));
- for (var i = 0; i < inputDetails.Count; i++)
- {
- var d = inputDetails[i];
- if (d.Id is > 0 && dbById.TryGetValue(d.Id.Value, out var existing))
- {
- existing.Hh = d.Hh ?? (i + 1);
- existing.PoBill = d.PoBill;
- existing.PoBillLine = d.PoBillLine;
- existing.OrderType = d.OrderType;
- existing.ShMaterialCode = d.ShMaterialCode;
- existing.ShMaterialName = d.ShMaterialName;
- existing.Th = d.Th;
- existing.ShDeliveryQuantity = d.ShDeliveryQuantity;
- existing.Bzsl = d.Bzsl;
- existing.Bqsl = d.Bqsl;
- existing.ShMaterialDw = d.ShMaterialDw;
- existing.Scrq = d.Scrq;
- existing.Scph = d.Scph;
- existing.Remarks = d.Remarks;
- existing.Djsl = d.Djsl;
- existing.Jybb = d.Jybb;
- existing.Jhdbh = d.Jhdbh;
- await _detailRep.UpdateAsync(existing);
- }
- else
- {
- var detail = new ScmShdzb
- {
- Id = YitIdHelper.NextId(),
- Glid = masterId.ToString(),
- Hh = d.Hh ?? (i + 1),
- PoBill = d.PoBill,
- PoBillLine = d.PoBillLine,
- OrderType = d.OrderType,
- ShMaterialCode = d.ShMaterialCode,
- ShMaterialName = d.ShMaterialName,
- Th = d.Th,
- ShDeliveryQuantity = d.ShDeliveryQuantity,
- Bzsl = d.Bzsl,
- Bqsl = d.Bqsl,
- ShMaterialDw = d.ShMaterialDw,
- Scrq = d.Scrq,
- Scph = d.Scph,
- Remarks = d.Remarks,
- Djsl = d.Djsl,
- Jybb = d.Jybb,
- Jhdbh = d.Jhdbh
- };
- await _detailRep.InsertAsync(detail);
- }
- }
- foreach (var old in dbDetails.Where(x => !inputIds.Contains(x.Id)))
- {
- await _detailRep.DeleteAsync(x => x.Id == old.Id);
- }
- }
- private static string BuildListOrderBy(string? sortField, string? sortOrder)
- {
- var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
- {
- ["shddh"] = "t.Shddh",
- ["poBill"] = "t.PoBill",
- ["poUsage"] = "t.PoUsage",
- ["jhshrq"] = "t.Jhshrq",
- ["shMaterialCode"] = "t.ShMaterialCode",
- ["shMaterialName"] = "t.ShMaterialName",
- ["shDeliveryQuantity"] = "t.ShDeliveryQuantity",
- ["sfpc"] = "t.Sfpc",
- ["pcrksl"] = "t.Pcrksl",
- ["shPurchaseName"] = "t.ShPurchaseName",
- ["shpc"] = "t.Shpc",
- ["scph"] = "t.Scph",
- ["wldh"] = "t.Wldh",
- ["dycs"] = "t.Dycs",
- ["shzt"] = "t.Shzt",
- ["th"] = "t.Th"
- };
- var field = map.TryGetValue(sortField ?? string.Empty, out var sqlField) ? sqlField : "t.mid";
- var order = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
- return $" ORDER BY {field} {order} ";
- }
- private static string BuildListSql() => """
- SELECT
- m.mid AS Mid,
- m.id AS Id,
- m.sh_purchase_name AS ShPurchaseName,
- m.sh_purchase_num AS ShPurchaseNum,
- m.shddh AS Shddh,
- m.jhshrq AS Jhshrq,
- m.sfpc AS Sfpc,
- m.wldh AS Wldh,
- m.dycs AS Dycs,
- m.shzt AS Shzt,
- m.sh_material_code AS ShMaterialCode,
- m.sh_material_name AS ShMaterialName,
- m.sh_delivery_quantity AS ShDeliveryQuantity,
- l.pcrksl AS Pcrksl,
- m.po_bill AS PoBill,
- po.`Usage` AS PoUsage,
- m.shpc AS Shpc,
- m.scph AS Scph,
- m.th AS Th,
- m.state AS State
- FROM
- (
- SELECT
- a.id mid,
- b.id,
- a.sh_purchase_id,
- a.sh_purchase_name,
- a.sh_purchase_num,
- a.sh_purchase_address,
- a.sh_purchase_lxr,
- a.sh_purchase_phone,
- a.client,
- a.delivery_Address,
- a.expected_consignee,
- a.consignee_phone,
- a.estimated_delivery_date,
- a.po_billno,
- a.shddh,
- a.jhshrq,
- a.tjrid,
- a.tjrxm,
- a.tjrq,
- a.scbq,
- a.chbg,
- a.sfpc,
- a.pcsm,
- a.wlsc,
- a.yjdhrq,
- a.state,
- IFNULL(a.shzt, '待收') shzt,
- a.wldh,
- a.dycs,
- CONCAT(IFNULL(a.sh_purchase_num, ''), IFNULL(a.sh_purchase_name, '')) gys,
- b.sh_material_code,
- b.sh_material_name,
- b.sh_material_ggxh,
- b.hh,
- b.po_bill,
- c.shpc,
- b.scph,
- b.sh_delivery_quantity,
- b.th
- FROM scm_shd a
- LEFT JOIN scm_shdzb b ON CAST(a.id AS CHAR) = b.glid
- LEFT JOIN (SELECT DISTINCT glid, shpc FROM scm_shbq) c ON CAST(b.id AS CHAR) = c.glid
- ) m
- LEFT JOIN
- (
- SELECT
- Delivery,
- LotSerial pc,
- SUM(ReceiptQty) zshl,
- AVG(yssl) rksl,
- SUM(QtyReturn) bhgsl,
- SUM(QtyReturned) thsl
- FROM vscm_cgshrk
- GROUP BY Delivery, LotSerial
- ) n ON m.shddh = n.Delivery AND m.shpc = n.pc
- LEFT JOIN
- (
- SELECT LotSerial, SUM(QtyChange) pcrksl
- FROM InvTransHist
- WHERE QtyChange > 0 AND Reason LIKE '%收货'
- GROUP BY LotSerial
- ) l ON m.shpc = l.LotSerial
- LEFT JOIN PurOrdMaster po ON m.po_bill = po.PurOrd
- """;
- private sealed class SupplierShipmentListRow
- {
- public long Mid { get; set; }
- public long Id { get; set; }
- public string? ShPurchaseName { get; set; }
- public string? ShPurchaseNum { get; set; }
- public string? Shddh { get; set; }
- public string? Jhshrq { get; set; }
- public int? Sfpc { get; set; }
- public string? Wldh { get; set; }
- public int? Dycs { get; set; }
- public string? Shzt { get; set; }
- public string? ShMaterialCode { get; set; }
- public string? ShMaterialName { get; set; }
- public decimal? ShDeliveryQuantity { get; set; }
- public decimal? Pcrksl { get; set; }
- public string? PoBill { get; set; }
- public string? PoUsage { get; set; }
- public string? Shpc { get; set; }
- public string? Scph { get; set; }
- public string? Th { get; set; }
- public int? State { get; set; }
- }
- private sealed class SupplierShipmentDraftRow
- {
- public string? SourceId { get; set; }
- public string? Gysdm { get; set; }
- public string? Gysmc { get; set; }
- public string? PoBill { get; set; }
- public int? PoBillLine { get; set; }
- public string? OrderType { get; set; }
- public string? ShMaterialCode { get; set; }
- public string? ShMaterialName { get; set; }
- public string? Th { get; set; }
- public decimal? ShDeliveryQuantity { get; set; }
- public decimal? Bzsl { get; set; }
- public decimal? Bqsl { get; set; }
- public string? ShMaterialDw { get; set; }
- public decimal? Djsl { get; set; }
- public string? Jhdbh { get; set; }
- public string? ShMaterialGgxh { get; set; }
- }
- private sealed class ShippingNoteMasterRow
- {
- public long id { get; set; }
- public long? sh_purchase_id { get; set; }
- public string? gysmc { get; set; }
- public string? gysdm { get; set; }
- public string? sh_purchase_address { get; set; }
- public string? sh_purchase_lxr { get; set; }
- public string? sh_purchase_phone { get; set; }
- public long? client { get; set; }
- public string? delivery_Address { get; set; }
- public string? expected_consignee { get; set; }
- public string? consignee_phone { get; set; }
- public DateTime? estimated_delivery_date { get; set; }
- public string? po_billno { get; set; }
- public string? shddh { get; set; }
- public string? jhshrq { get; set; }
- public string? tjrid { get; set; }
- public string? tjrxm { get; set; }
- public string? tjrq { get; set; }
- public int? scbq { get; set; }
- public string? wlsc { get; set; }
- public string? yjdhrq { get; set; }
- public string? wldh { get; set; }
- public int? sfpc { get; set; }
- public string? pcsm { get; set; }
- public string? chbg { get; set; }
- }
- private sealed class ShippingNoteDetailRow
- {
- public string? shddh { get; set; }
- public int? xh { get; set; }
- public string? ddbh { get; set; }
- public string? ddlx { get; set; }
- public string? lx1 { get; set; }
- public string? wlbm { get; set; }
- public string? wlmc { get; set; }
- public string? ggxh { get; set; }
- public decimal? shsl { get; set; }
- public string? dw { get; set; }
- public string? bz { get; set; }
- public string? scrq { get; set; }
- public string? scph { get; set; }
- public string? th { get; set; }
- }
- private sealed class SupplierShipmentLabelRow
- {
- public string? Glid { get; set; }
- public string? Wlbm { get; set; }
- public string? Wlmc { get; set; }
- public string? Ggxh { get; set; }
- public decimal? Zxsl { get; set; }
- public string? Dw { get; set; }
- public string? Remarks { get; set; }
- public decimal? Bz { get; set; }
- public string? Ddlx { get; set; }
- public string? Ddh { get; set; }
- public string? Shdh { get; set; }
- public int? Shdhh { get; set; }
- public string? Scrq { get; set; }
- public string? Scph { get; set; }
- public string? Xh { get; set; }
- public string? Gysmc { get; set; }
- public string? Th { get; set; }
- public string? Bbh { get; set; }
- public string? Yt { get; set; }
- public string? Ccrq { get; set; }
- public string? Shpc { get; set; }
- }
- }
|