附近小店
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

561 行
14 KiB

  1. package svc
  2. import (
  3. "applet/app/db"
  4. "applet/app/db/model"
  5. "applet/app/e"
  6. "applet/app/md"
  7. "applet/app/utils"
  8. "applet/app/utils/cache"
  9. "encoding/json"
  10. "fmt"
  11. "github.com/gin-gonic/gin"
  12. "strings"
  13. "time"
  14. "xorm.io/xorm"
  15. )
  16. func PrinterCateList(c *gin.Context) {
  17. var list = []map[string]string{
  18. {
  19. "name": "普通打印机",
  20. "key": "ordinary",
  21. },
  22. }
  23. e.OutSuc(c, list, nil)
  24. return
  25. }
  26. func PrinterLocationList(c *gin.Context) {
  27. var list = []map[string]string{
  28. {
  29. "name": "前台",
  30. "key": "reception",
  31. },
  32. {
  33. "name": "后厨",
  34. "key": "kitchen",
  35. },
  36. }
  37. e.OutSuc(c, list, nil)
  38. return
  39. }
  40. // 打印机列表
  41. func PrinterIndexList(c *gin.Context) {
  42. var search md.IndexRequest
  43. if err := c.ShouldBindJSON(&search); err != nil {
  44. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  45. return
  46. }
  47. engine := MasterDb(c)
  48. if engine == nil {
  49. e.OutErr(c, e.ERR_MASTER_ID, nil)
  50. return
  51. }
  52. list, err := db.GetPrinterIndexList(engine, &search)
  53. fmt.Println(err)
  54. fmt.Println(list)
  55. if err != nil {
  56. e.OutErr(c, e.ERR_BAD_REQUEST, err)
  57. return
  58. }
  59. if list == nil {
  60. list = make([]md.IndexResList, 0)
  61. }
  62. printerModule, _ := db.GetAllPrinterModuleList(engine)
  63. //处理模板数据
  64. var moduleArr = make(map[int]string, 0)
  65. var moduleContentArr = make(map[int]string, 0)
  66. if printerModule != nil {
  67. for _, v := range printerModule {
  68. moduleArr[v.Id] = v.Name
  69. moduleContentArr[v.Id] = v.Content
  70. }
  71. }
  72. var useArr = []string{"离线", "在线"}
  73. for k, v := range list {
  74. isUse := utils.StrToInt(v.IsUse)
  75. list[k].UseStr = useArr[isUse]
  76. ModuleId := utils.StrToInt(v.ModuleId)
  77. list[k].ModuleStr = moduleArr[ModuleId]
  78. list[k].Content = moduleContentArr[ModuleId]
  79. list[k].Img = "http://ossn.izhim.net/o2o_printer.png"
  80. }
  81. e.OutSuc(c, &list, nil)
  82. return
  83. }
  84. // 模板列表
  85. func PrinterModuleList(c *gin.Context) {
  86. var search md.IndexRequest
  87. if err := c.ShouldBindJSON(&search); err != nil {
  88. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  89. return
  90. }
  91. engine := MasterDb(c)
  92. if engine == nil {
  93. e.OutErr(c, e.ERR_MASTER_ID, nil)
  94. return
  95. }
  96. list, err := db.GetPrinterModuleList(engine, &search)
  97. if err != nil {
  98. e.OutErr(c, e.ERR_BAD_REQUEST, err)
  99. return
  100. }
  101. if list == nil {
  102. list = make([]md.ModuleResList, 0)
  103. }
  104. e.OutSuc(c, &list, nil)
  105. return
  106. }
  107. func PrinterIndexSave(c *gin.Context) {
  108. var search md.IndexSaveRequest
  109. if err := c.ShouldBindJSON(&search); err != nil {
  110. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  111. return
  112. }
  113. if search.Type == "" {
  114. search.Type = "ordinary"
  115. }
  116. eg := MasterDb(c)
  117. //判断是不是有人绑过了
  118. if search.Type != "bluetooth" {
  119. count := db.IndexExists(eg, &search)
  120. check := 1
  121. if utils.StrToInt(search.Id) > 0 {
  122. //判断下是不是同一条记录保存
  123. data, _ := db.IndexById(eg, &search)
  124. if data != nil && data.SnNum == search.SnNum {
  125. check = 0
  126. }
  127. }
  128. if count > 0 && check == 1 {
  129. e.OutErr(c, 400, e.NewErr(400, "该打印机已被绑定过"))
  130. return
  131. }
  132. }
  133. var module = model.CommunityTeamStorePrinter{
  134. Id: utils.StrToInt(search.Id),
  135. StoreId: utils.StrToInt(search.StoreId),
  136. SnNum: search.SnNum,
  137. IdentificationCode: search.IdentificationCode,
  138. Name: search.Name,
  139. IsUse: utils.StrToInt(search.IsUse),
  140. UpdateTime: time.Now(),
  141. Type: search.Type,
  142. LocationType: search.LocationType,
  143. }
  144. if search.Type != "bluetooth" {
  145. args := md.PrinterReq{
  146. Sn: search.SnNum,
  147. Key: search.IdentificationCode,
  148. Remark: search.Name,
  149. PrinterType: search.Type,
  150. }
  151. //调用公共代码 调用打印机添加与编辑
  152. if utils.StrToInt(search.Id) > 0 { //编辑
  153. err := EditPrinter(c, args)
  154. if err != nil {
  155. e.OutErr(c, 400, err)
  156. return
  157. }
  158. } else {
  159. err := AddPrinter(c, args)
  160. if err != nil {
  161. e.OutErr(c, 400, err)
  162. return
  163. }
  164. }
  165. }
  166. id, err := db.IndexInsert(eg, &module)
  167. if id == 0 || err != nil {
  168. e.OutErr(c, 400, e.NewErr(400, "保存失败"))
  169. return
  170. }
  171. e.OutSuc(c, "success", nil)
  172. return
  173. }
  174. // 模板id修改
  175. func PrinterIndexModuleSave(c *gin.Context) {
  176. var search md.IndexSaveRequest
  177. if err := c.ShouldBindJSON(&search); err != nil {
  178. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  179. return
  180. }
  181. var module = model.CommunityTeamStorePrinter{
  182. Id: utils.StrToInt(search.Id),
  183. ModuleId: utils.StrToInt(search.ModuleId),
  184. UpdateTime: time.Now(),
  185. }
  186. id, err := db.IndexUpdate(MasterDb(c), &module, "module_id,update_time")
  187. if id == 0 || err != nil {
  188. e.OutErr(c, 400, e.NewErr(400, "保存失败"))
  189. return
  190. }
  191. e.OutSuc(c, "success", nil)
  192. return
  193. }
  194. // 使用状态修改
  195. func PrinterIndexStateSave(c *gin.Context) {
  196. var search md.IndexSaveRequest
  197. if err := c.ShouldBindJSON(&search); err != nil {
  198. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  199. return
  200. }
  201. var module = model.CommunityTeamStorePrinter{
  202. Id: utils.StrToInt(search.Id),
  203. IsUse: utils.StrToInt(search.IsUse),
  204. UpdateTime: time.Now(),
  205. }
  206. id, err := db.IndexUpdate(MasterDb(c), &module, "is_use,update_time")
  207. if id == 0 || err != nil {
  208. e.OutErr(c, 400, e.NewErr(400, "保存失败"))
  209. return
  210. }
  211. e.OutSuc(c, "success", nil)
  212. return
  213. }
  214. // 删除打印机
  215. func PrinterDelIndex(c *gin.Context, ids, storeId string) {
  216. engine := MasterDb(c)
  217. //查出这条记录拿sn码
  218. printerOne, _ := db.GetPrinterIndexById(engine, ids, storeId)
  219. if printerOne.Id == 0 {
  220. e.OutErr(c, 400, e.NewErr(400, "删除失败"))
  221. return
  222. }
  223. if printerOne.Type != "bluetooth" {
  224. //调用打印机删除
  225. args := md.PrinterReq{
  226. Sn: printerOne.SnNum,
  227. PrinterType: printerOne.Type,
  228. }
  229. err := DelPrinter(c, args)
  230. if err != nil {
  231. e.OutErr(c, 400, err)
  232. return
  233. }
  234. }
  235. has, err := engine.Where("id=? and store_id=?", ids, storeId).Delete(new(model.CommunityTeamStorePrinter))
  236. if err != nil {
  237. e.OutErr(c, e.ERR_DB_ORM, err)
  238. return
  239. }
  240. if has == 0 {
  241. e.OutErr(c, 400, e.NewErr(400, "删除失败"))
  242. return
  243. }
  244. e.OutSuc(c, []int{}, nil)
  245. return
  246. }
  247. // 明细筛选条件
  248. func PrinterIndexRecordScreen(c *gin.Context) {
  249. var search md.RecordRequest
  250. if err := c.ShouldBindJSON(&search); err != nil {
  251. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  252. return
  253. }
  254. engine := MasterDb(c)
  255. if engine == nil {
  256. e.OutErr(c, e.ERR_MASTER_ID, nil)
  257. return
  258. }
  259. printer, _ := db.GetPrinterIndexAll(engine, search.StoreId)
  260. var r md.RecordPrinterScreen
  261. r.TimeSort = []md.NewSelectList{
  262. {
  263. Key: "",
  264. Name: "默认排序",
  265. },
  266. {
  267. Key: "printer_time_desc",
  268. Name: "时间由近到远",
  269. },
  270. {
  271. Key: "printer_time_asc",
  272. Name: "时间由远到近",
  273. },
  274. }
  275. r.PrinterList = make([]md.NewSelectList, 0)
  276. for _, v := range printer {
  277. var tmp = md.NewSelectList{
  278. Key: utils.IntToStr(v.Id),
  279. Name: v.Name,
  280. }
  281. r.PrinterList = append(r.PrinterList, tmp)
  282. }
  283. e.OutSuc(c, r, nil)
  284. return
  285. }
  286. // 明细
  287. func PrinterIndexRecordList(c *gin.Context) {
  288. var search md.RecordRequest
  289. if err := c.ShouldBindJSON(&search); err != nil {
  290. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  291. return
  292. }
  293. engine := MasterDb(c)
  294. if engine == nil {
  295. e.OutErr(c, e.ERR_MASTER_ID, nil)
  296. return
  297. }
  298. list, err := db.GetPrinterRecordList(engine, &search)
  299. if err != nil {
  300. e.OutErr(c, e.ERR_BAD_REQUEST, err)
  301. return
  302. }
  303. if list == nil {
  304. list = make([]md.RecordResList, 0)
  305. }
  306. var stateArr = []string{"正在打印", "打印成功", "打印失败"}
  307. var ordTypeArr = []string{"聚合收款订单", "外卖订单", "到店订单", "聚合收款订单"}
  308. for k, v := range list {
  309. State := utils.StrToInt(v.State)
  310. list[k].StateStr = stateArr[State]
  311. OrdType := utils.StrToInt(v.OrdType)
  312. list[k].OrdTypeStr = ordTypeArr[OrdType]
  313. list[k].Title = "#" + v.Id + " " + ordTypeArr[OrdType]
  314. if v.OrdId == "XXX" {
  315. list[k].Title = "#" + v.Id + " 测试"
  316. }
  317. list[k].PrintContent = strings.ReplaceAll(v.PrintContent, "<BR>", "\n")
  318. list[k].PrintContent = strings.ReplaceAll(list[k].PrintContent, "<QR>", "<二维码标签左>")
  319. list[k].PrintContent = strings.ReplaceAll(list[k].PrintContent, "</QR>", "<二维码标签右>")
  320. }
  321. e.OutSuc(c, &list, nil)
  322. return
  323. }
  324. func PrinterIndexToSend(c *gin.Context) {
  325. var search md.IndexTestRequest
  326. if err := c.ShouldBindJSON(&search); err != nil {
  327. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  328. return
  329. }
  330. // 加锁 防止并发
  331. mutexKey := fmt.Sprintf("%s:printer_send:p%ss%s", c.GetString("mid"), search.PrinterId, search.StoreId)
  332. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  333. if err != nil {
  334. e.OutErr(c, e.ERR, err)
  335. return
  336. }
  337. if withdrawAvailable != "OK" {
  338. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过于频繁,请稍后再试"))
  339. return
  340. }
  341. eg := MasterDb(c)
  342. printerOne, _ := db.GetPrinterIndexById(eg, search.PrinterId, search.StoreId)
  343. if printerOne.Id == 0 {
  344. e.OutErr(c, 400, e.NewErr(400, "打印机不存在"))
  345. return
  346. }
  347. if printerOne.ModuleId == 0 {
  348. e.OutErr(c, 400, e.NewErr(400, "请选择打印模板"))
  349. return
  350. }
  351. ord := make(map[string]string, 0)
  352. ord["name"] = "XXX"
  353. ord["payment"] = "XXX"
  354. ord["phone"] = "XXX"
  355. ord["address"] = "XXX"
  356. ord["main_ord_id"] = "XXX"
  357. ord["num"] = "XXX"
  358. ord["table_num"] = "XXX"
  359. ord["store_name"] = "XXX"
  360. ord["store_qrcode_url"] = getStoreUrl(c, search.StoreId, "")
  361. ord["qrcode_url"] = getDownUrl(c, "")
  362. goodsInfo := make([]map[string]string, 0)
  363. one := map[string]string{
  364. "name": "测试",
  365. "price": "10",
  366. "num": "1",
  367. "prices": "10",
  368. }
  369. goodsInfo = append(goodsInfo, one)
  370. var args = &md.PrinterRequest{
  371. StoreId: search.StoreId,
  372. PrinterId: search.PrinterId,
  373. MasterId: c.GetString("mid"),
  374. Ord: ord,
  375. GoodsInfo: goodsInfo,
  376. }
  377. ReplaceOne(c, args)
  378. e.OutSuc(c, "success", nil)
  379. return
  380. }
  381. // 处理订单打印内容
  382. func ReplacePrinterContent(c *gin.Context) {
  383. var maps map[string]string
  384. if err := c.ShouldBindJSON(&maps); err != nil {
  385. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  386. return
  387. }
  388. mainOrdId := maps["main_ord_id"]
  389. // 加锁 防止并发
  390. mutexKey := fmt.Sprintf("%s:printer_content:%s", c.GetString("mid"), mainOrdId)
  391. withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX")
  392. if err != nil {
  393. e.OutErr(c, e.ERR, err)
  394. return
  395. }
  396. if withdrawAvailable != "OK" {
  397. e.OutErr(c, e.ERR, e.NewErr(400000, "操作过于频繁,请稍后再试"))
  398. return
  399. }
  400. engine := MasterDb(c)
  401. storeId, ord, goodsInfo, err := CommGetPrinterContent(c, mainOrdId)
  402. if err != nil {
  403. e.OutErr(c, 400, err)
  404. return
  405. }
  406. //打印操作
  407. go ReplaceDoing(c, engine, storeId, ord, goodsInfo)
  408. e.OutSuc(c, "success", nil)
  409. return
  410. }
  411. func CommGetPrinterContent(c *gin.Context, mainOrdId string) (int, map[string]string, []map[string]string, error) {
  412. var storeId int
  413. ord := make(map[string]string, 0)
  414. var goodsInfo = make([]map[string]string, 0)
  415. engine := MasterDb(c)
  416. mainOrd := db.GetOrderByOid(engine, mainOrdId)
  417. if mainOrd == nil {
  418. return storeId, ord, goodsInfo, e.NewErr(400, "未查询到订单!")
  419. }
  420. ordItem := db.GetOrderInfoAllEg(engine, mainOrdId)
  421. if ordItem == nil {
  422. return storeId, ord, goodsInfo, e.NewErr(400, "未查询到订单!")
  423. }
  424. //查出订单id
  425. storeId = mainOrd.StoreUid
  426. ord["name"] = mainOrd.BuyName
  427. ord["phone"] = mainOrd.BuyPhone
  428. ord["address"] = mainOrd.Address
  429. ord["main_ord_id"] = utils.Int64ToStr(mainOrd.Oid)
  430. ord["order_type"] = "2"
  431. if mainOrd.Code != "" {
  432. ord["num"] = mainOrd.Code
  433. }
  434. if mainOrd.TableNum != "" {
  435. ord["table_num"] = mainOrd.TableNum
  436. }
  437. var storeInfo model.CommunityTeamStore
  438. engine.Where("uid = ?", storeId).Get(&storeInfo)
  439. ord["store_name"] = storeInfo.Name
  440. userProfile, _ := db.UserProfileFindByID(engine, storeId)
  441. inviteCode := ""
  442. if userProfile != nil && userProfile.Uid > 0 {
  443. inviteCode = userProfile.InviteCode
  444. }
  445. ord["qrcode_url"] = getDownUrl(c, inviteCode)
  446. ord["store_qrcode_url"] = getStoreUrl(c, utils.IntToStr(storeId), inviteCode)
  447. //查出对应商品的信息
  448. var payment float64 = 0
  449. for _, v := range *ordItem {
  450. one := map[string]string{
  451. "name": v.Title,
  452. "price": utils.Float64ToStr(utils.FloatFormat(utils.StrToFloat64(v.Price)/float64(v.Num), 2)),
  453. "num": utils.IntToStr(v.Num),
  454. "prices": v.Price,
  455. }
  456. payment += utils.StrToFloat64(v.Price)
  457. one["sku_text"] = ""
  458. skuText := make([]map[string]string, 0)
  459. json.Unmarshal([]byte(v.SkuInfo), &skuText)
  460. if len(skuText) > 0 {
  461. skuText1 := ""
  462. for _, v1 := range skuText {
  463. skuText1 += v1["name"] + ":" + v1["value"] + " "
  464. }
  465. one["sku_text"] = skuText1
  466. }
  467. goodsInfo = append(goodsInfo, one)
  468. }
  469. payment = utils.FloatFormat(payment, 2)
  470. ord["payment"] = utils.Float64ToStr(payment)
  471. return storeId, ord, goodsInfo, nil
  472. }
  473. // 替换打印
  474. func ReplaceDoing(c *gin.Context, eg *xorm.Engine, storeId int, ord map[string]string, goodsInfo []map[string]string) {
  475. var args = &md.PrinterRequest{
  476. StoreId: utils.IntToStr(storeId),
  477. PrinterId: "",
  478. MasterId: c.GetString("mid"),
  479. Ord: ord,
  480. GoodsInfo: goodsInfo,
  481. }
  482. ReplaceMore(c, args)
  483. }
  484. func getDownUrl(c *gin.Context, inviteCode string) string {
  485. downLoadRoute := "/#/zy-landing-page/pages/lading-page-download/lading-page-download?invited_code=" + inviteCode
  486. h5Domain := GetWebSiteDomainInfo(c, "wap")
  487. shareUrl := h5Domain + downLoadRoute
  488. //判断生成短链
  489. shareUrl = CommShareShorUrl(c, shareUrl)
  490. return shareUrl
  491. }
  492. func getStoreUrl(c *gin.Context, storeId, invitedCode string) string {
  493. downLoadRoute := "%s/#/zy-o2o-base/pages/store-page/store-page?id=%s&invited_code=%s"
  494. h5Domain := GetWebSiteDomainInfo(c, "wap")
  495. shareUrl := fmt.Sprintf(downLoadRoute, h5Domain, storeId, invitedCode)
  496. //判断生成短链
  497. shareUrl = CommShareShorUrl(c, shareUrl)
  498. return shareUrl
  499. }
  500. func CommShareShorUrl(c *gin.Context, shareUrl string) string {
  501. val := SysCfgFind(c, "share_link_type")
  502. if val["share_link_type"] == "1" { //百度短链
  503. shareUrl, _ = ShortenUrl(shareUrl)
  504. } else if val["share_link_type"] == "2" { //快站短链
  505. shareUrl = KuaiZhanShortURL(c, shareUrl)
  506. }
  507. return shareUrl
  508. }
  509. func PrinterIndexCheck(c *gin.Context) {
  510. var maps map[string]string
  511. if err := c.ShouldBindJSON(&maps); err != nil {
  512. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  513. return
  514. }
  515. mainOrdId := maps["main_ord_id"]
  516. engine := MasterDb(c)
  517. storeId, ord, goodsInfo, err := CommGetPrinterContent(c, mainOrdId)
  518. if err != nil {
  519. e.OutErr(c, 400, err)
  520. return
  521. }
  522. printerOne, _ := db.GetPrinterIndexByBluetooth(engine, utils.IntToStr(storeId))
  523. var res = map[string]interface{}{
  524. "is_has_bluetooth": "0",
  525. "content": "",
  526. }
  527. if printerOne != nil {
  528. res["is_has_bluetooth"] = "1"
  529. }
  530. var args = &md.PrinterRequest{
  531. StoreId: utils.IntToStr(storeId),
  532. PrinterId: "",
  533. MasterId: c.GetString("mid"),
  534. Ord: ord,
  535. GoodsInfo: goodsInfo,
  536. }
  537. res["content"] = GetReplaceContent(c, args)
  538. e.OutSuc(c, res, nil)
  539. return
  540. }