rule_service.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. qu "qfw/util"
  10. "strconv"
  11. "strings"
  12. "time"
  13. . "util"
  14. "github.com/go-xweb/xweb"
  15. "gopkg.in/mgo.v2/bson"
  16. )
  17. type Rule struct {
  18. *xweb.Action
  19. //rule
  20. ruleList xweb.Mapper `xweb:"/service/rule/list"` //规则列表
  21. ruleCreate xweb.Mapper `xweb:"/service/rule/create"` //新建规则
  22. ruleDel xweb.Mapper `xweb:"/service/rule/del"` //删除规则
  23. ruleEdit xweb.Mapper `xweb:"/service/rule/edit"` //编辑规则
  24. ruleSave xweb.Mapper `xweb:"/service/rule/save"` //保存规则
  25. ruleImport xweb.Mapper `xweb:"/service/rule/import"` //导入文件excel
  26. //history
  27. archive xweb.Mapper `xweb:"/service/rule/archive"` //存档
  28. history xweb.Mapper `xweb:"/service/rule/history"` //变更列表
  29. productData xweb.Mapper `xweb:"/service/rule/produce"` //生成预览数据
  30. downloadData xweb.Mapper `xweb:"/service/rule/download"` //下载数据
  31. demoData xweb.Mapper `xweb:"/service/rule/preview"` //预览数据
  32. exportEs xweb.Mapper `xweb:"/service/rule/exportes"` //导出es
  33. }
  34. //规则列表
  35. func (r *Rule) RuleList() {
  36. defer qu.Catch()
  37. if r.Method() == "POST" {
  38. start, _ := r.GetInteger("start")
  39. limit, _ := r.GetInteger("length")
  40. draw, _ := r.GetInteger("draw")
  41. searchStr := r.GetString("search[value]")
  42. search := strings.TrimSpace(searchStr)
  43. //qu.Debug(start, limit, draw, search)
  44. query := bson.M{
  45. "b_delete": false,
  46. }
  47. if search != "" {
  48. query["$or"] = []interface{}{
  49. bson.M{"s_customername": bson.M{"$regex": search}},
  50. bson.M{"s_tagname": bson.M{"$regex": search}},
  51. }
  52. }
  53. data, _ := Mgo.Find("tags", query, nil, nil, false, start, limit)
  54. count := Mgo.Count("tags", query)
  55. r.ServeJson(map[string]interface{}{
  56. "draw": draw,
  57. "data": data,
  58. "recordsFiltered": count,
  59. "recordsTotal": count,
  60. })
  61. } else {
  62. r.T["preview_href"] = PreviewHref
  63. r.Render("private/rule_list.html", &r.T)
  64. }
  65. }
  66. func (r *Rule) RuleCreate() {
  67. defer qu.Catch()
  68. if r.Method() == "POST" {
  69. } else {
  70. r.T["province"] = Province
  71. r.T["city"] = ProvinceCitys
  72. r.T["district"] = CityDistricts
  73. r.T["topTypeArr"] = TopTypeArr
  74. r.T["subTypeArr"] = SubTypeArr
  75. r.T["matchTypeMap"] = MatchTypeMap
  76. r.T["existField"] = ExistFiled
  77. r.T["buyerClass"] = BuyerClass
  78. r.T["scopeClass"] = ScopeClassMap
  79. r.Render("private/rule_create.html", &r.T)
  80. }
  81. }
  82. func (r *Rule) RuleDel() {
  83. defer qu.Catch()
  84. _id := r.GetString("_id")
  85. set := bson.M{
  86. "$set": bson.M{
  87. "b_delete": true,
  88. },
  89. }
  90. b := Mgo.UpdateById("tags", _id, set)
  91. fmt.Println("Delete Tags Data Id:", _id, b)
  92. r.ServeJson(map[string]interface{}{
  93. "rep": b,
  94. })
  95. }
  96. func (r *Rule) RuleImport() {
  97. defer qu.Catch()
  98. if r.Method() == "POST" {
  99. mf, _, err := r.GetFile("xlsx")
  100. if err == nil {
  101. binary, err := ioutil.ReadAll(mf)
  102. if err == nil {
  103. rdata, err := Parsxlsx(binary)
  104. if err == nil {
  105. //id, rep := updateDbXf("", rdata)
  106. //qu.Debug("import data:", rdata)
  107. r.ServeJson(map[string]interface{}{
  108. "rdata": rdata,
  109. "id": "",
  110. "rep": true,
  111. })
  112. return
  113. }
  114. }
  115. }
  116. r.ServeJson(map[string]interface{}{
  117. "rep": false,
  118. })
  119. }
  120. }
  121. func (r *Rule) RuleEdit() {
  122. defer qu.Catch()
  123. id := r.GetString("id") //规则列表编辑
  124. dataid := r.GetString("dataid") //反馈列表编辑
  125. query := bson.M{}
  126. if id != "" {
  127. query["_id"] = qu.StringTOBsonId(id)
  128. } else if dataid != "" {
  129. query["s_dataid"] = dataid
  130. }
  131. data, _ := Mgo.FindOneByField("tags", query, `{}`)
  132. (*data)["id"] = qu.BsonIdToSId((*data)["_id"])
  133. r.T["data"] = *data
  134. r.T["province"] = Province
  135. r.T["city"] = ProvinceCitys
  136. r.T["district"] = CityDistricts
  137. r.T["topTypeArr"] = TopTypeArr
  138. r.T["subTypeArr"] = SubTypeArr
  139. r.T["matchTypeMap"] = MatchTypeMap
  140. r.T["existField"] = ExistFiled
  141. r.T["buyerClass"] = BuyerClass
  142. r.T["scopeClass"] = ScopeClassMap
  143. r.Render("private/rule_edit.html", &r.T)
  144. }
  145. func (r *Rule) RuleSave() {
  146. defer qu.Catch()
  147. if r.Method() == "POST" {
  148. user := r.GetSession("user").(map[string]interface{})
  149. data := GetPostForm(r.Request)
  150. id := data["id"].(string)
  151. delete(data, "id")
  152. o_rules := []map[string]interface{}{}
  153. o_rulesStr := data["o_rules"].(string)
  154. json.Unmarshal([]byte(o_rulesStr), &o_rules)
  155. data["o_rules"] = o_rules
  156. data["i_esquerytype"] = 2 //手动输入es
  157. if s_esquery, _ := data["s_esquery"].(string); s_esquery == "" { //自动生成es
  158. data["s_esquery"] = Utiltags(data)
  159. data["i_esquerytype"] = 1
  160. }
  161. i_createtime := time.Now().Unix()
  162. data["i_createtime"] = i_createtime
  163. data["i_updatetime"] = i_createtime
  164. data["s_createuser"] = user["name"]
  165. data["s_updateuser"] = user["name"]
  166. data["b_delete"] = false
  167. s_customername := data["s_customername"].(string)
  168. s_tagname := data["s_tagname"].(string)
  169. data["s_dataid"] = qu.SE.EncodeString(fmt.Sprintf("%v", i_createtime) + s_customername + s_tagname)
  170. id, rep := updateDbXf(id, data) //保存tags
  171. r.ServeJson(map[string]interface{}{
  172. "id": id,
  173. "rep": rep,
  174. "s_dataid": data["s_dataid"],
  175. })
  176. }
  177. }
  178. func (r *Rule) Archive() {
  179. defer qu.Catch()
  180. if r.Method() == "POST" {
  181. rep := false
  182. _id := r.GetString("_id")
  183. query := bson.M{
  184. "_id": qu.StringTOBsonId(_id),
  185. }
  186. tag, _ := Mgo.FindOne("tags", query)
  187. if len(*tag) > 0 {
  188. user := r.GetSession("user").(map[string]interface{})
  189. histoty, _ := Mgo.FindOne("tags_history", `{"s_tagid":"`+_id+`"}`)
  190. s_state := "创建"
  191. if len(*histoty) > 0 { //该id已有记录
  192. s_state = "变更"
  193. }
  194. (*tag)["s_tagid"] = _id //tags表id
  195. (*tag)["s_state"] = s_state //状态
  196. (*tag)["l_changetime"] = time.Now().Unix() //变更时间
  197. (*tag)["s_changeperson"] = user["name"]
  198. id := Mgo.Save("tags_history", tag)
  199. if id != "" {
  200. rep = true
  201. }
  202. }
  203. r.ServeJson(map[string]interface{}{
  204. "rep": rep,
  205. })
  206. }
  207. }
  208. func (r *Rule) History() {
  209. defer qu.Catch()
  210. tagid := r.GetString("tagid")
  211. if r.Method() == "POST" {
  212. data, _ := Mgo.Find("tags_history", `{"s_tagid":"`+tagid+`"}`, nil, nil, false, -1, -1)
  213. r.ServeJson(map[string]interface{}{
  214. "data": data,
  215. })
  216. } else {
  217. r.T["tagid"] = tagid
  218. r.Render("private/rule_history.html", &r.T)
  219. }
  220. }
  221. func (r *Rule) ExportEs() {
  222. defer qu.Catch()
  223. id := r.GetString("id")
  224. if id == "" {
  225. return
  226. }
  227. w := r.ResponseWriter
  228. tag, _ := Mgo.FindById("tags", id, `{}`)
  229. s_esquery := (*tag)["s_esquery"].(string)
  230. createEsJosn(s_esquery)
  231. file, err := os.Open("./download/es.json")
  232. defer file.Close()
  233. if err != nil {
  234. fmt.Println("Open File Err:", err)
  235. r.ServeJson(map[string]interface{}{
  236. "rep": false,
  237. })
  238. return
  239. }
  240. fileHeader := make([]byte, 512)
  241. file.Read(fileHeader)
  242. fileStat, _ := file.Stat()
  243. w.Header().Set("Content-Disposition", "attachment; filename=./download/es.json")
  244. w.Header().Set("Content-Type", http.DetectContentType(fileHeader))
  245. w.Header().Set("Content-Length", strconv.FormatInt(fileStat.Size(), 10))
  246. file.Seek(0, 0)
  247. io.Copy(w, file)
  248. return
  249. }
  250. func createEsJosn(es string) {
  251. defer qu.Catch()
  252. jmap := make(map[string]interface{})
  253. err := json.Unmarshal([]byte(es), &jmap)
  254. //j, err := json.Marshal(es)
  255. if err != nil {
  256. fmt.Println("S_esquery To Json Err:", err)
  257. return
  258. }
  259. fp, err := os.OpenFile("./download/es.json", os.O_RDWR|os.O_CREATE, 0755)
  260. if err != nil {
  261. fmt.Println("Create File Err:", err)
  262. return
  263. }
  264. defer fp.Close()
  265. j, _ := json.Marshal(jmap)
  266. _, err = fp.Write(j)
  267. if err != nil {
  268. fmt.Println("Write File Err:", err)
  269. return
  270. }
  271. }
  272. //更新xlsx db
  273. func updateDbXf(id string, rdata map[string]interface{}) (rid string, rep bool) {
  274. defer qu.Catch()
  275. if id == "" {
  276. rid = Mgo.Save("tags", rdata)
  277. if rid != "" {
  278. rep = true
  279. } else {
  280. rep = false
  281. }
  282. } else {
  283. rid = id
  284. query := bson.M{
  285. "_id": qu.StringTOBsonId(id),
  286. }
  287. rep = Mgo.Update("tags", query, bson.M{"$set": rdata}, false, false)
  288. }
  289. return
  290. }
  291. func (r *Rule) DemoData() {
  292. defer qu.Catch()
  293. if r.Method() == "POST" {
  294. sDataid := r.GetString("s_dataid")
  295. start, _ := r.GetInteger("start")
  296. limit, _ := r.GetInteger("length")
  297. draw, _ := r.GetInteger("draw")
  298. query := bson.M{
  299. "s_dataid": sDataid,
  300. }
  301. data, _ := Mgo.Find("tagsdata", query, `{"publishtime":-1}`, nil, false, start, limit)
  302. count := Mgo.Count("tagsdata", query)
  303. r.ServeJson(map[string]interface{}{
  304. "data": data,
  305. "draw": draw,
  306. "recordsFiltered": count,
  307. "recordsTotal": count,
  308. })
  309. }
  310. }
  311. func (r *Rule) ProductData() {
  312. defer qu.Catch()
  313. if r.Method() == "POST" {
  314. rep := false
  315. id := r.GetString("id")
  316. fmt.Println(id)
  317. tag, _ := Mgo.FindById("tags", id, `{}`)
  318. err := UtilEsFind(*tag)
  319. if err == nil {
  320. rep = true
  321. }
  322. r.ServeJson(map[string]interface{}{
  323. "rep": rep,
  324. })
  325. }
  326. }
  327. func (r *Rule) DownloadData() {
  328. defer qu.Catch()
  329. dataId := r.GetString("s_dataid")
  330. if path := ResponseXlsx(dataId); path == "" {
  331. r.ServeJson("内部错误")
  332. } else {
  333. r.ServeFile(path)
  334. }
  335. }