You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mshop_reprice_module.spm 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #block
  2. /*
  3. {
  4. "result": true,
  5. "message": "",
  6. "task": {
  7. "id": "weeek/2026-01-01",
  8. "title": "Переоценка м001",
  9. "dep": "001",
  10. "comment": "коммент",
  11. "items": [
  12. {
  13. "id": "Артикул/Цвет/Документ",
  14. "product_id": "Артикул/Цвет/Документ",
  15. "article": "123-091",
  16. "color": "цвет",
  17. "size": "размер",
  18. "sector": "сектор",
  19. "group": "группа",
  20. "image": "https://.../112209-0.jpg",
  21. "title": "ТАПОЧКИ",
  22. "base_price": 1000,
  23. "price": 800,
  24. "disc": "20%",
  25. "label_color": "Белый | Красный",
  26. "rest": 4,
  27. "qty": null,
  28. "done": false,
  29. "done_updated": "2026-01-01 12:21:11"
  30. }
  31. ]
  32. }
  33. }
  34. */
  35. #endblock
  36. #proc create_tables
  37. #src ct
  38. #r
  39. create table if not EXISTS [const_pereocenka_report] (
  40. `ССЫЛКА` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  41. `ДОКУМЕНТ` INT UNSIGNED NOT NULL,
  42. `АРТИКУЛ` VARCHAR(50) NOT NULL,
  43. `ЦВЕТ` VARCHAR(50) NOT NULL,
  44. `ЦЕНА` INT NOT NULL,
  45. `ДатаИзменения` datetime default NULL,
  46. PRIMARY KEY (`ССЫЛКА`),
  47. KEY (`ДОКУМЕНТ`),
  48. KEY (`АРТИКУЛ`),
  49. KEY (`ЦВЕТ`),
  50. KEY (`ЦЕНА`),
  51. KEY (`ДатаИзменения`),
  52. UNIQUE KEY (`ДОКУМЕНТ`,`АРТИКУЛ`,`ЦВЕТ`,`ЦЕНА`)
  53. ) ENGINE=InnoDB CHARACTER SET cp1251;
  54. #query
  55. #endsrc
  56. #if !@{select 1 from information_schema.columns where table_schema=schema() and table_name='const_pereocenka_report' and column_name='ДатаИзменения'}@
  57. @{alter table [const_pereocenka_report] add ДатаИзменения datetime default NULL;}@
  58. #endif
  59. #endproc
  60. #proc init_params
  61. #include_module price_module
  62. #se const_pereocenka_report=const_pereocenka_report
  63. #globalobjs_get Dep.Код
  64. #se Подразделение.код=[dep.код]
  65. #se DateTo=@{SELECT Date_format(NOW(), '%Y.%m.%d 23:59:59')}@
  66. #if [task_id]=week
  67. #se DateFrom=@{SELECT Date_format(DATE_SUB('[DateTo]', INTERVAL 7 DAY), '%Y.%m.%d 00:00:00')}@
  68. #else
  69. #if [task_id]=daily
  70. #se DateFrom=@{SELECT Date_format(DATE_SUB('[DateTo]', INTERVAL 1 DAY), '%Y.%m.%d 00:00:00')}@
  71. #else
  72. #se DateFrom=@{SELECT Date_format('[task_id]', '%Y.%m.%d 00:00:00')}@
  73. #se DateTo=@{SELECT Date_format('[task_id]', '%Y.%m.%d 23:59:59')}@
  74. #endif
  75. #endif
  76. ;#se DF=@{select Date_format(DATE_ADD('[DateFrom]', INTERVAL -1 DAY), '%Y.%m.%d 16:00:00')}@
  77. ;#se DT=@{select Date_format('[DateTo]', '%Y.%m.%d 23:59:59')}@
  78. ;#se user_ref=[user_ref]
  79. #se user_ref=@{select ссылка from spravochniki_sotrudniki where ref=@'[j:body.access_payload.sp_ref]'@ }@
  80. #se store_id=@{select MAX(ссылка) from spravochniki_tara where наименование like '%торговый%зал%'}@
  81. #se tara_t=[store_id]
  82. #se PlanPriceType=@{select Ссылка from spravochniki_tipicen as tp where Наименование='РозницаПлан'}@
  83. #endproc
  84. #proc mshop_reprice.sql_query
  85. #call init_params
  86. #call create_tables
  87. #se report_ref=@{SELECT UUID_SHORT();}@
  88. #se SELECT_QUERY=@!,concat('https://media.saticogroup.com/dm/goodpics/marmalato?good_id=',if(c_name.Наименование is null,substring_index((select min(Код) from @<Справочники.ХарактеристикиНоменклатуры>@ as xar where xar.Владелец=nom.Ссылка),',',1),substring_index(xar.Код,',',1))) as Фото_link ,s_name.Наименование AS 'Размер'!@
  89. #include_module reprice_sql
  90. [#reprice_sql.build_query]
  91. #endproc
  92. #proc mshop_reprice.get.list
  93. /*не актуальный*/
  94. #src stats
  95. #r
  96. select count(distinct IF(IFNULL(LENGTH(`Подтоварить`),0)>0 AND `Дата подтоварки`>date(date_sub(now(),interval 6 hour)),Характеристика,NULL)) as items_done,
  97. count(distinct IF(IFNULL(LENGTH(`Подтоварить`),0)=0 OR `Дата подтоварки`>date(date_sub(now(),interval 6 hour)),Характеристика,NULL)) as items
  98. from ([#mshop_reprice.sql_query]) as qq
  99. #query
  100. #endsrc
  101. #se j:result={{"result":true,"message":""}}
  102. #v j:task={{}}
  103. #v j:task.id="torg_zal"
  104. #v j:task.title="ПОДТОВАРКА ТЗ"
  105. #v j:task.created="[$f::now]"
  106. #v j:task.comment="Подтоварка торгового зала"
  107. #if {stats}
  108. #v j:task.items_count={stats.items}
  109. #v j:task.items_done={stats.items_done}
  110. #else
  111. #v j:task.items_count=0
  112. #v j:task.items_done=0
  113. #endif
  114. #se j:result.tasks=[[ [j:task] ]]
  115. #endproc
  116. #proc mshop_reprice.get.task
  117. #se task_id=[j:query.task_id]
  118. #src items_sql
  119. #r
  120. [#mshop_reprice.sql_query]
  121. #query
  122. #endsrc
  123. #se j:result={{"result":true,"message":""}}
  124. #v DF=@{select Date_format('[DateFrom]', '%d.%m.%Y')}@
  125. #v DT=@{select Date_format('[DateTo]', '%d.%m.%Y')}@
  126. #v j:task={{}}
  127. #v j:task.id="[task_id]"
  128. #v j:task.title="Переоценка м[Подразделение.код]"
  129. #v j:task.dep="[Подразделение.код]"
  130. #v j:task.comment="За период с [DF] по [DT]"
  131. #v j:items=[[ ]]
  132. #foreach items_sql
  133. #v j:item={{}}
  134. #v j:item.id="{items_sql.pos_id}"
  135. #v j:item.product_id="{items_sql.Коды}"
  136. #v j:item.article="{items_sql.Артикул}"
  137. #v j:item.color="{items_sql.Цвет}"
  138. #v j:item.size="{items_sql.Размер}"
  139. #v j:item.sector="{items_sql.Сектор}"
  140. #v j:item.group="{items_sql.Группа}"
  141. #v j:item.image="{items_sql.Фото_link}"
  142. #v j:item.title="{items_sql.Наименование}"
  143. #v j:item.base_price="{items_sql.Цена план}"
  144. #v j:item.price="{items_sql.Цена новая}"
  145. #v j:item.disc="{items_sql.Скидка, %}"
  146. #v j:item.label_color="{items_sql.Ценник}"
  147. #v j:item.rest={items_sql.Остаток (арт.+цвет)}
  148. #v j:item.qty={items_sql.Остаток (арт.+цвет)}
  149. #v j:item.done=[$f::if({items_sql.done},true,false)]
  150. #v j:item.done_updated="{items_sql.done_updated}"
  151. #v j:items[[]]=$j:item
  152. #endfor
  153. #v j:task.items=$j:items
  154. #se j:result.task=$j:task
  155. #endproc
  156. #proc mshop_reprice.post.update_item
  157. #se const_pereocenka_report=const_pereocenka_report
  158. #v tov_id=[j:query.item_id]
  159. #v done=[j:body.done]
  160. #v user_ref=@{select ссылка from spravochniki_sotrudniki where ref=@'[j:body.access_payload.sp_ref]'@ }@
  161. #v j:result={{}}
  162. #if !$tov_id
  163. #v j:result.result=false
  164. #v j:result.message="Не указан код товара"
  165. #se j:result=$j:result
  166. #exit
  167. #endif
  168. #v (artikul,color,doc,price)=@{SELECT CONCAT_WS(',', SUBSTRING_INDEX('[tov_id]', '/', 1), SUBSTRING_INDEX(SUBSTRING_INDEX('[tov_id]', '/', 2), '/', -1), SUBSTRING_INDEX(SUBSTRING_INDEX('[tov_id]', '/', 3), '/', -1), SUBSTRING_INDEX('[tov_id]', '/', -1))}@
  169. ;#v tov_exist=@{SELECT 1 FROM INNER JOIN WHERE = AND }@
  170. ;TODO проверка существования товара по артикул + цвет
  171. #v lst_upd=[$f::now()]
  172. #if [done]=true
  173. @{INSERT INTO [const_pereocenka_report] (ДОКУМЕНТ, АРТИКУЛ, ЦВЕТ, ЦЕНА, ДатаИзменения) VALUES('[doc]','[artikul]','[color]','[price]', NOW()) ON DUPLICATE KEY UPDATE ДатаИзменения = VALUES(ДатаИзменения)}@
  174. #else
  175. #se nl=@{DELETE FROM [const_pereocenka_report] WHERE ДОКУМЕНТ='[doc]' AND АРТИКУЛ='[artikul]' AND ЦВЕТ='[color]' AND ЦЕНА='[price]'}@
  176. #endif
  177. #v j:update_item={{}}
  178. #v j:update_item.id="[tov_id]"
  179. #v j:update_item.done=[done]
  180. #v j:update_item.done_updated="[lst_upd]"
  181. #v j:items_update=[[ ]]
  182. #v j:items_update[[]]=$j:update_item
  183. #v j:update={{}}
  184. #v j:update.items=$j:items_update
  185. #v j:result.result=true
  186. #v j:result.message=""
  187. #v j:result.update=$j:update
  188. #se j:result=$j:result
  189. #endproc
  190. #proc mshop_reprice.post.close_task
  191. /*TODO переписать для reprice*/
  192. #exit
  193. #v user_ref=@{select ссылка from spravochniki_sotrudniki where ref=@'[j:body.access_payload.sp_ref]'@ }@
  194. #src items_sql
  195. #r
  196. [#mshop_reprice.sql_query]
  197. #query
  198. #endsrc
  199. #foreach items_sql
  200. #if [$f::if({items_sql.done},true,false)]=false
  201. #call mshop_refill.set_done('{items_sql.Характеристика}',true,$user_ref)
  202. ;TODO заполнять j:result.update как в mshop_refill.post.update_item
  203. #endif
  204. #endfor
  205. #se j:result={{"result":true,"message":"Все позиции подтоварены"}}
  206. #endproc
  207. #proc mshop_reprice.get.find_item
  208. #se code=[j:query.code]
  209. #globalobjs_get Dep.Код
  210. #src price_col
  211. #r
  212. Select tc.ссылка as 'Тип_цены_ссылка', IFNULL(tc.БАЗОВЫЙТИПЦЕН, 0) as 'Тип_цены_базовый_ссылка'
  213. From @<Справочники.Подразделения>@ as podr inner join @<Справочники.ТипыЦен>@ as tc on tc.ссылка = podr.ТИПЦЕН
  214. Where podr.КОД='[Dep.Код]'
  215. #query
  216. #endsrc
  217. #src find_sql
  218. #r
  219. SELECT
  220. CONCAT(nom.АРТИКУЛ, '/', IFNULL(c_name.Наименование, '*'), '/', pr.ДОКУМЕНТ, '/', ROUND(pr.ЦЕНА)) AS 'pos_id'
  221. FROM @<Таблицы.Прайсы>@ as pr
  222. INNER JOIN @<Документы.УстановкаЦенНоменклатуры>@ as uc ON uc.ССЫЛКА = pr.ДОКУМЕНТ
  223. INNER JOIN @<Справочники.Номенклатура>@ as nom ON nom.ссылка = pr.НОМЕНКЛАТУРА
  224. LEFT JOIN @<Справочники.ХарактеристикиНоменклатуры>@ as xar ON xar.ссылка = pr.ХАРАКТЕРИСТИКА
  225. LEFT JOIN @<таблицы.значениясвойств>@ as ssv_c ON ssv_c.объект = pr.ХАРАКТЕРИСТИКА AND ssv_c.свойство = (Select MAX(ссылка) From @<Справочники.НаименованияСвойств>@ Where наименование = 'Цвет')
  226. LEFT JOIN @<Справочники.ЗначенияСвойств>@ as c_name ON c_name.Ссылка = ssv_c.Значение
  227. LEFT JOIN @<Таблицы.ОстаткиТовараВТаре>@ as dv ON dv.ХАРАКТЕРИСТИКА = pr.ХАРАКТЕРИСТИКА AND dv.КАЧЕСТВО = 'НОВЫЙ' AND dv.ТАРА = [tara_t]
  228. LEFT JOIN @<Справочники.ШтрихКодаТоваров>@ as sht ON sht.Характеристика = xar.ссылка
  229. LEFT JOIN @<Справочники.ШтрихКода>@ as sh ON sh.Ссылка = sht.Ссылка
  230. LEFT JOIN const_marking_values as mark on mark.Характеристика=xar.Ссылка
  231. WHERE pr.ТИПЦЕНЫ IN ({price_col.Тип_цены_ссылка}, {price_col.Тип_цены_базовый_ссылка})
  232. AND pr.КАЧЕСТВО = 'НОВЫЙ'
  233. AND (
  234. nom.АРТИКУЛ ='[code]'
  235. OR xar.КОД ='[code]'
  236. OR nom.НАИМЕНОВАНИЕ LIKE '%[code]%'
  237. OR xar.ссылка ='[code]'
  238. OR sh.ШтрихКод ='[code]'
  239. OR mark.Серийныйномер='[code]'
  240. OR mark.Кодмаркировки='[code]'
  241. )
  242. GROUP BY pr.НОМЕНКЛАТУРА, IFNULL(c_name.Наименование, '*'), ROUND(pr.ЦЕНА)
  243. HAVING IFNULL(SUM(dv.КОЛИЧЕСТВО), 0) > 0
  244. LIMIT 1
  245. #query
  246. #endsrc
  247. #if {find_sql.pos_id}
  248. #se j:result={{"result":true,"message":"Найден","item_id":"{find_sql.pos_id}"}}
  249. #else
  250. ;#if {find_sql.}
  251. ; #se j:result={{"result":false,"message":"Код не опознан","item_id":""}}
  252. ;#else
  253. #se j:result={{"result":false,"message":"Товар не входит в текущее задание","item_id":""}}
  254. #endif
  255. #endproc