f_reallocqty.srf 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. $PBExportHeader$f_reallocqty.srf
  2. global type f_reallocqty from function_object
  3. end type
  4. forward prototypes
  5. global function integer f_reallocqty (boolean arg_reallocall, boolean arg_ignorout, ref string arg_msg)
  6. end prototypes
  7. global function integer f_reallocqty (boolean arg_reallocall, boolean arg_ignorout, ref string arg_msg); //朗的代码
  8. Int rslt = 1
  9. Long ll_i, ll_j, ll_k, ll_cnt
  10. Boolean lb_enough
  11. Decimal ld_lake, ld_add
  12. dbauo_taskmx mx
  13. dbauo_adapter adapter
  14. uo_mtrlware_assign uo_assign_bill
  15. uo_assign_bill = Create uo_mtrlware_assign
  16. adapter = Create dbauo_adapter
  17. adapter.f_init()
  18. adapter.ins_reallocall = arg_reallocall
  19. adapter.ins_ignorout = arg_ignorout
  20. adapter.f_sort1()
  21. adapter.f_sort2()
  22. Long ll_bestIndex = 0, ll_bestCount = 0
  23. FOR ll_i = 1 To UpperBound(adapter.ins_sorts)
  24. IF adapter.ins_sorts[ll_i].ins_taskcount > ll_bestCount THEN
  25. ll_bestIndex = ll_i
  26. ll_bestCount = adapter.ins_sorts[ll_i].ins_taskcount
  27. END IF
  28. NEXT
  29. //MessageBox('', string(adapter.ins_sorts[1].ins_taskcount) + ',' + string(adapter.ins_sorts[2].ins_taskcount))
  30. dbauo_task task
  31. DateTime dt_serverTime
  32. SELECT TOP 1 GETDATE()
  33. INTO :dt_serverTime
  34. From u_user;
  35. String ls_logText
  36. IF ll_bestIndex > 0 THEN
  37. // 取消分配与占用库存
  38. FOR ll_i = 1 To UpperBound(adapter.ins_sorts[ll_bestIndex].ins_sort)
  39. task = adapter.ins_sorts[ll_bestIndex].ins_sort[ll_i]
  40. If (adapter.ins_ignorout And task.ins_hasoutware) Or (Not adapter.ins_reallocall And task.ins_isOK) THEN
  41. FOR ll_j = 1 To UpperBound(task.ins_mx)
  42. mx = task.ins_mx[ll_j]
  43. FOR ll_k = 1 To UpperBound(mx.ins_assigns)
  44. IF Not IsNull(mx.ins_assigns[ll_k].ins_mtrlwaremx) THEN
  45. mx.ins_assigns[ll_k].ins_mtrlwaremx.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty
  46. mx.ins_assigns[ll_k].ins_mtrlwaremx.ins_mtrlware.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty
  47. ELSE // 没有分配库存
  48. IF mx.ins_assigns[ll_k].ins_qty = 0 THEN CONTINUE
  49. // SELECT COUNT(0) INTO :ll_cnt FROM u_mtrlware where mtrlwareid = :mx.ins_assigns[ll_k].ins_mtrlwareid;
  50. // if sqlca.sqlcode <> 0 then
  51. // rslt = 0
  52. // arg_msg = '已分配的库存不存在 mtrlwareid=' + string(mx.ins_assigns[ll_k].ins_mtrlwareid)
  53. // goto ext
  54. // end if
  55. //
  56. // decimal ll_noallocqty
  57. // long ll_storagetype, ll_mtrlid
  58. // string ll_mtrlcuscode, ll_status, ll_pcode, ll_woodcode
  59. // SELECT u_mtrlware.noallocqty,
  60. // u_storage.storagetype,
  61. // u_mtrlware.mtrlid,
  62. // u_mtrlware.mtrlcuscode,
  63. // u_mtrlware.status,
  64. // u_mtrlware.pcode,
  65. // u_mtrlware.woodcode
  66. // INTO : ll_noallocqty,
  67. // :ll_storagetype,
  68. // :ll_mtrlid,
  69. // :ll_mtrlcuscode,
  70. // :ll_status,
  71. // :ll_pcode,
  72. // :ll_woodcode
  73. // FROM u_mtrlware inner join u_storage on u_mtrlware.storageid = u_storage.storageid
  74. // where u_mtrlware.mtrlwareid = :mx.ins_assigns[ll_k].ins_mtrlwareid;
  75. // if sqlca.sqlcode <> 0 then
  76. // rslt = 0
  77. // arg_msg = '查询库存信息失败'
  78. // goto ext
  79. // end if
  80. //
  81. // if ll_storagetype <> 1 then
  82. // rslt = 0
  83. // arg_msg = '库存仓库 storagetype <> 1'
  84. // goto ext
  85. // end if
  86. //
  87. // if ll_noallocqty <= 0 then
  88. // rslt = 0
  89. // arg_msg = '库存数为0'
  90. // goto ext
  91. // end if
  92. //
  93. // if ll_mtrlid <> mx.ins_mtrlid OR ll_mtrlcuscode <> mx.ins_mtrlcuscode &
  94. // OR ll_status <> mx.ins_status OR ll_pcode <> mx.ins_pcode &
  95. // OR ll_woodcode <> mx.ins_woodcode then
  96. // rslt = 0
  97. // arg_msg = '分配库存与明细物料不相符'
  98. // goto ext
  99. // end if
  100. END IF
  101. NEXT
  102. NEXT
  103. ELSE
  104. FOR ll_j = 1 To UpperBound(task.ins_mx)
  105. mx = task.ins_mx[ll_j]
  106. FOR ll_k = 1 To UpperBound(mx.ins_assigns)
  107. IF uo_assign_bill.uof_assign_del(mx.ins_assigns[ll_k].ins_assignid,&
  108. mx.ins_assigns[ll_k].ins_qty,ARG_MSG,False) <> 1 THEN
  109. // rslt = 0
  110. // goto ext
  111. // GOTO _next
  112. END IF
  113. NEXT
  114. NEXT
  115. END IF
  116. NEXT
  117. // 重新分配
  118. FOR ll_i = 1 To UpperBound(adapter.ins_sorts[ll_bestIndex].ins_sort)
  119. task = adapter.ins_sorts[ll_bestIndex].ins_sort[ll_i]
  120. ls_logText = String(dt_serverTime, 'yyyy-MM-dd HH:mm:ss') + '--' + String(ll_i, '00000') + '--'
  121. IF task.ins_hasmoney THEN
  122. ls_logText += '足钱--'
  123. ELSE
  124. ls_logText += '差钱--'
  125. END IF
  126. IF task.ins_hasoutware THEN
  127. ls_logText += '已发货--'
  128. ELSE
  129. ls_logText += '未发货--'
  130. END IF
  131. IF task.ins_isOK THEN
  132. ls_logText += '已齐货--'
  133. ELSE
  134. ls_logText += '未齐货--'
  135. END IF
  136. If (adapter.ins_ignorout And task.ins_hasoutware) Or (Not adapter.ins_reallocall And task.ins_isOK) THEN
  137. ls_logText += '跳过'
  138. task.f_WriteLog(ls_logText)
  139. CONTINUE
  140. END IF
  141. lb_enough = True
  142. FOR ll_j = 1 To UpperBound(task.ins_mx)
  143. IF task.ins_mx[ll_j].ins_saleqty > task.ins_mx[ll_j].ins_mtrlware.ins_noallocqty THEN
  144. lb_enough = False
  145. EXIT
  146. END IF
  147. NEXT
  148. IF lb_enough THEN
  149. ls_logText += '够库存--'
  150. ELSE
  151. ls_logText += '缺库存--'
  152. END IF
  153. IF Not lb_enough THEN
  154. ls_logText += '跳过'
  155. task.f_WriteLog(ls_logText)
  156. CONTINUE
  157. END IF
  158. FOR ll_j = 1 To UpperBound(task.ins_mx)
  159. mx = task.ins_mx[ll_j]
  160. // IF Not lb_enough THEN
  161. // // 取消分配
  162. // FOR ll_k = 1 To UpperBound(mx.ins_assigns)
  163. // IF uo_assign_bill.uof_assign_del(mx.ins_assigns[ll_k].ins_assignid,&
  164. // mx.ins_assigns[ll_k].ins_qty,ARG_MSG,False) <> 1 THEN
  165. // GOTO _next
  166. // END IF
  167. // NEXT
  168. // ELSE
  169. //
  170. // FOR ll_k = 1 To UpperBound(mx.ins_assigns)
  171. // // IF IsNull(mx.ins_assigns[ll_k].ins_mtrlwaremx) THEN
  172. // IF uo_assign_bill.uof_assign_del(mx.ins_assigns[ll_k].ins_assignid,&
  173. // mx.ins_assigns[ll_k].ins_qty,ARG_MSG,False) <> 1 THEN
  174. // GOTO _next
  175. // END IF
  176. // mx.ins_allocqty -= mx.ins_assigns[ll_k].ins_qty
  177. // // ELSE
  178. // // mx.ins_mtrlware.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty
  179. // // mx.ins_assigns[ll_k].ins_mtrlwaremx.ins_noallocqty -= mx.ins_assigns[ll_k].ins_qty
  180. // // END IF
  181. // NEXT
  182. //
  183. //
  184. // IF Not task.ins_isOK THEN
  185. ld_lake = mx.ins_saleqty - mx.ins_allocqty
  186. FOR ll_k = 1 To UpperBound(mx.ins_mtrlware.mx)
  187. IF ld_lake > mx.ins_mtrlware.mx[ll_k].ins_noallocqty THEN
  188. ld_add = mx.ins_mtrlware.mx[ll_k].ins_noallocqty
  189. ld_lake -= ld_add
  190. ELSE
  191. ld_add = ld_lake
  192. ld_lake = 0
  193. END IF
  194. IF ld_add > 0 THEN
  195. IF ld_add = 300 THEN
  196. ld_add = ld_add
  197. END IF
  198. mx.ins_mtrlware.mx[ll_k].ins_noallocqty -= ld_add
  199. mx.ins_mtrlware.ins_noallocqty -= ld_add
  200. IF uo_assign_bill.uof_assign_add(mx.ins_task.ins_scid,&
  201. mx.ins_mtrlware.mx[ll_k].ins_mtrlwareid,1,mx.ins_task.ins_taskid,&
  202. mx.ins_printid,ld_add,0,'','','',&
  203. 0,2,publ_operator,ARG_MSG,True) <> 1 THEN
  204. // GOTO _next
  205. END IF
  206. END IF
  207. IF ld_lake = 0 THEN EXIT
  208. ls_logText += String(ld_lake,'0.00') + '--'
  209. NEXT
  210. ls_logText += '分配完成'
  211. task.f_WriteLog(ls_logText)
  212. // END IF
  213. // END IF
  214. // _next:
  215. NEXT
  216. NEXT
  217. END IF
  218. //ext:
  219. Destroy uo_assign_bill
  220. Destroy adapter
  221. IF rslt = 0 THEN
  222. ROLLBACK;
  223. ELSE
  224. COMMIT;
  225. END IF
  226. RETURN rslt
  227. end function