Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

mshop_reprice_module.spm 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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. #endif
  74. #endif
  75. ;#se DF=@{select Date_format(DATE_ADD('[DateFrom]', INTERVAL -1 DAY), '%Y.%m.%d 16:00:00')}@
  76. ;#se DT=@{select Date_format('[DateTo]', '%Y.%m.%d 23:59:59')}@
  77. ;#se user_ref=[user_ref]
  78. #se user_ref=@{select ссылка from spravochniki_sotrudniki where ref=@'[j:body.access_payload.sp_ref]'@ }@
  79. #se store_id=@{select MAX(ссылка) from spravochniki_tara where наименование like '%торговый%зал%'}@
  80. #se tara_t=[store_id]
  81. #se PlanPriceType=@{select Ссылка from spravochniki_tipicen as tp where Наименование='РозницаПлан'}@
  82. #endproc
  83. #proc mshop_reprice.sql_query
  84. #call init_params
  85. #call create_tables
  86. #se report_ref=@{SELECT UUID_SHORT();}@
  87. #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 'Размер'!@
  88. #include_module reprice_sql
  89. [#reprice_sql.build_query]
  90. #endproc
  91. #proc mshop_reprice.get.list
  92. /*не актуальный*/
  93. #src stats
  94. #r
  95. select count(distinct IF(IFNULL(LENGTH(`Подтоварить`),0)>0 AND `Дата подтоварки`>date(date_sub(now(),interval 6 hour)),Характеристика,NULL)) as items_done,
  96. count(distinct IF(IFNULL(LENGTH(`Подтоварить`),0)=0 OR `Дата подтоварки`>date(date_sub(now(),interval 6 hour)),Характеристика,NULL)) as items
  97. from ([#mshop_reprice.sql_query]) as qq
  98. #query
  99. #endsrc
  100. #se j:result={{"result":true,"message":""}}
  101. #v j:task={{}}
  102. #v j:task.id="torg_zal"
  103. #v j:task.title="ПОДТОВАРКА ТЗ"
  104. #v j:task.created="[$f::now]"
  105. #v j:task.comment="Подтоварка торгового зала"
  106. #if {stats}
  107. #v j:task.items_count={stats.items}
  108. #v j:task.items_done={stats.items_done}
  109. #else
  110. #v j:task.items_count=0
  111. #v j:task.items_done=0
  112. #endif
  113. #se j:result.tasks=[[ [j:task] ]]
  114. #endproc
  115. #proc mshop_reprice.get.task
  116. #se task_id=[j:query.task_id]
  117. #src items_sql
  118. #r
  119. [#mshop_reprice.sql_query]
  120. #query
  121. #endsrc
  122. #se j:result={{"result":true,"message":""}}
  123. #v DF=@{select Date_format('[DateFrom]', '%d.%m.%Y')}@
  124. #v DT=@{select Date_format('[DateTo]', '%d.%m.%Y')}@
  125. #v j:task={{}}
  126. #v j:task.id="[task_id]"
  127. #v j:task.title="Переоценка м[Подразделение.код]"
  128. #v j:task.dep="[Подразделение.код]"
  129. #v j:task.comment="За период с [DF] по [DT]"
  130. #v j:items=[[ ]]
  131. #foreach items_sql
  132. #v j:item={{}}
  133. #v j:item.id="{items_sql.pos_id}"
  134. #v j:item.product_id="{items_sql.Коды}"
  135. #v j:item.article="{items_sql.Артикул}"
  136. #v j:item.color="{items_sql.Цвет}"
  137. #v j:item.size="{items_sql.Размер}"
  138. #v j:item.sector="{items_sql.Сектор}"
  139. #v j:item.group="{items_sql.Группа}"
  140. #v j:item.image="{items_sql.Фото_link}"
  141. #v j:item.title="{items_sql.Наименование}"
  142. #v j:item.base_price="{items_sql.Цена план}"
  143. #v j:item.price="{items_sql.Цена новая}"
  144. #v j:item.disc="{items_sql.Скидка, %}"
  145. #v j:item.label_color="{items_sql.Ценник}"
  146. #v j:item.rest={items_sql.Остаток (арт.+цвет)}
  147. #v j:item.qty={items_sql.Остаток (арт.+цвет)}
  148. #v j:item.done=[$f::if({items_sql.done},true,false)]
  149. #v j:item.done_updated="{items_sql.done_updated}"
  150. #v j:items[[]]=$j:item
  151. #endfor
  152. #v j:task.items=$j:items
  153. #se j:result.task=$j:task
  154. #endproc
  155. #proc mshop_reprice.post.update_item
  156. #se const_pereocenka_report=const_pereocenka_report
  157. #v tov_id=[j:query.item_id]
  158. #v done=[j:body.done]
  159. #v user_ref=@{select ссылка from spravochniki_sotrudniki where ref=@'[j:body.access_payload.sp_ref]'@ }@
  160. #v j:result={{}}
  161. #if !$tov_id
  162. #v j:result.result=false
  163. #v j:result.message="Не указан код товара"
  164. #se j:result=$j:result
  165. #exit
  166. #endif
  167. #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))}@
  168. ;#v tov_exist=@{SELECT 1 FROM INNER JOIN WHERE = AND }@
  169. ;TODO проверка существования товара по артикул + цвет
  170. #v lst_upd=[$f::now()]
  171. #if [done]=true
  172. @{INSERT INTO [const_pereocenka_report] (ДОКУМЕНТ, АРТИКУЛ, ЦВЕТ, ЦЕНА, ДатаИзменения) VALUES('[doc]','[artikul]','[color]','[price]', NOW()) ON DUPLICATE KEY UPDATE ДатаИзменения = VALUES(ДатаИзменения)}@
  173. #else
  174. #se nl=@{DELETE FROM [const_pereocenka_report] WHERE ДОКУМЕНТ='[doc]' AND АРТИКУЛ='[artikul]' AND ЦВЕТ='[color]' AND ЦЕНА='[price]'}@
  175. #endif
  176. #v j:update_item={{}}
  177. #v j:update_item.id="[tov_id]"
  178. #v j:update_item.done=[done]
  179. #v j:update_item.done_updated="[lst_upd]"
  180. #v j:items_update=[[ ]]
  181. #v j:items_update[[]]=$j:update_item
  182. #v j:update={{}}
  183. #v j:update.items=$j:items_update
  184. #v j:result.result=true
  185. #v j:result.message=""
  186. #v j:result.update=$j:update
  187. #se j:result=$j:result
  188. #endproc
  189. #proc mshop_reprice.post.close_task
  190. /*TODO переписать для reprice*/
  191. #exit
  192. #v user_ref=@{select ссылка from spravochniki_sotrudniki where ref=@'[j:body.access_payload.sp_ref]'@ }@
  193. #src items_sql
  194. #r
  195. [#mshop_reprice.sql_query]
  196. #query
  197. #endsrc
  198. #foreach items_sql
  199. #if [$f::if({items_sql.done},true,false)]=false
  200. #call mshop_refill.set_done('{items_sql.Характеристика}',true,$user_ref)
  201. ;TODO заполнять j:result.update как в mshop_refill.post.update_item
  202. #endif
  203. #endfor
  204. #se j:result={{"result":true,"message":"Все позиции подтоварены"}}
  205. #endproc
  206. #proc mshop_reprice.get.find_item
  207. #se code=[j:query.code]
  208. #globalobjs_get Dep.Код
  209. #src price_col
  210. #r
  211. Select tc.ссылка as 'Тип_цены_ссылка', IFNULL(tc.БАЗОВЫЙТИПЦЕН, 0) as 'Тип_цены_базовый_ссылка'
  212. From @<Справочники.Подразделения>@ as podr inner join @<Справочники.ТипыЦен>@ as tc on tc.ссылка = podr.ТИПЦЕН
  213. Where podr.КОД='[Dep.Код]'
  214. #query
  215. #endsrc
  216. #src find_sql
  217. #r
  218. SELECT
  219. CONCAT(nom.АРТИКУЛ, '/', IFNULL(c_name.Наименование, '*'), '/', pr.ДОКУМЕНТ, '/', ROUND(pr.ЦЕНА)) AS 'pos_id'
  220. FROM @<Таблицы.Прайсы>@ as pr
  221. INNER JOIN @<Документы.УстановкаЦенНоменклатуры>@ as uc ON uc.ССЫЛКА = pr.ДОКУМЕНТ
  222. INNER JOIN @<Справочники.Номенклатура>@ as nom ON nom.ссылка = pr.НОМЕНКЛАТУРА
  223. LEFT JOIN @<Справочники.ХарактеристикиНоменклатуры>@ as xar ON xar.ссылка = pr.ХАРАКТЕРИСТИКА
  224. LEFT JOIN @<таблицы.значениясвойств>@ as ssv_c ON ssv_c.объект = pr.ХАРАКТЕРИСТИКА AND ssv_c.свойство = (Select MAX(ссылка) From @<Справочники.НаименованияСвойств>@ Where наименование = 'Цвет')
  225. LEFT JOIN @<Справочники.ЗначенияСвойств>@ as c_name ON c_name.Ссылка = ssv_c.Значение
  226. LEFT JOIN @<Таблицы.ОстаткиТовараВТаре>@ as dv ON dv.ХАРАКТЕРИСТИКА = pr.ХАРАКТЕРИСТИКА AND dv.КАЧЕСТВО = 'НОВЫЙ' AND dv.ТАРА = [tara_t]
  227. LEFT JOIN @<Справочники.ШтрихКодаТоваров>@ as sht ON sht.Характеристика = xar.ссылка
  228. LEFT JOIN @<Справочники.ШтрихКода>@ as sh ON sh.Ссылка = sht.Ссылка
  229. LEFT JOIN const_marking_values as mark on mark.Характеристика=xar.Ссылка
  230. WHERE pr.ТИПЦЕНЫ IN ({price_col.Тип_цены_ссылка}, {price_col.Тип_цены_базовый_ссылка})
  231. AND pr.КАЧЕСТВО = 'НОВЫЙ'
  232. AND (
  233. nom.АРТИКУЛ ='[code]'
  234. OR xar.КОД ='[code]'
  235. OR nom.НАИМЕНОВАНИЕ LIKE '%[code]%'
  236. OR xar.ссылка ='[code]'
  237. OR sh.ШтрихКод ='[code]'
  238. OR mark.Серийныйномер='[code]'
  239. OR mark.Кодмаркировки='[code]'
  240. )
  241. GROUP BY pr.НОМЕНКЛАТУРА, IFNULL(c_name.Наименование, '*'), ROUND(pr.ЦЕНА)
  242. HAVING IFNULL(SUM(dv.КОЛИЧЕСТВО), 0) > 0
  243. LIMIT 1
  244. #query
  245. #endsrc
  246. #if {find_sql.pos_id}
  247. #se j:result={{"result":true,"message":"Найден","item_id":"{find_sql.pos_id}"}}
  248. #else
  249. ;#if {find_sql.}
  250. ; #se j:result={{"result":false,"message":"Код не опознан","item_id":""}}
  251. ;#else
  252. #se j:result={{"result":false,"message":"Товар не входит в текущее задание","item_id":""}}
  253. #endif
  254. #endproc