Răsfoiți Sursa

Merge remote-tracking branch 'origin/dev2.3.12' into dev2.3.12

# Conflicts:
#	src/templateManage/jyTemplateManageController.go
#	src/templateManage/jyTemplateManageService.go
WH01243 3 ani în urmă
părinte
comite
13641376c3

+ 469 - 0
doc/2.3.12版本/升级sql/用户表调整sql.md

@@ -6,4 +6,473 @@ ALTER TABLE `jianyu`.`user`
 ADD COLUMN `user_type` int(2) NULL DEFAULT 1 COMMENT '用户类型 1-普通用户 2-内部员工 3-豁免用户' AFTER `user_id`;
 ```
 2. 历史数据处理
+mysql 库处理
+```
+UPDATE user set user_type=2 WHERE user_id in (用户id,...)
+-- 正式环境执行
+UPDATE user set user_type=2 WHERE user_id in ("5be90fc8c9ebc242cc2ca055",
+"5be90f7cc9ebc242cc2ca04f",
+"5dd806fe0680a44dd614fcc4",
+"5eaa2577c9ebc20648b2ac44",
+"5d2c26aec9ebc2572aad00fb",
+"585cc52fc9ebc23d92000014",
+"5a8064acc9ebc21b9cdd5945",
+"5e4a94330680a46d69286a7d",
+"5aa63391c9ebc21749d7facb",
+"5b8c9507c9ebc2168dd8f9cf",
+"5ea4ff550680a45c42b223a0",
+"5b5ac420c9ebc27f0b4ad2b6",
+"5e86f725c9ebc22451ba0aef",
+"5b7e2145c9ebc22d1c8322e4",
+"5c3ecf30c9ebc245590dc5fa",
+"5cc558f0c9ebc266c890c3dc",
+"5c64d2a1c9ebc250b1851f54",
+"5d0da4080680a424f070178a",
+"5f9a1f220680a47eec55eadf",
+"56fb8e6aaf537416e000000a",
+"581858dbc9ebc2132200002e",
+"5ea107c30680a45c42b20aa8",
+"60459ab4196e44e6dc0cb9b7",
+"60582a63945ce516737f1147",
+"5f817034ab6fddc7783dc3bf",
+"5d42c182c9ebc2453288012b",
+"5cbd5135c9ebc24597acc2f0",
+"5cbd4dc7c9ebc231f5f7c762",
+"5638254eaf53741bfc000052",
+"5e8c48d70680a473b141fc08",
+"5fc5b835d394daefa24e7c34",
+"5a9f6d18c9ebc2494eb5db07",
+"5d8427a2c9ebc24f3530c643",
+"5f237535c9ebc276f45952f0",
+"5f295ef8acc2e7041e3e9774",
+"5af297c8c9ebc245cdee7f59",
+"5c3bfccdc9ebc245590db6d9",
+"5bee1fa3c9ebc24b7110da8a",
+"5c10d576c9ebc20f2ee6cfed",
+"5b694d1bc9ebc219e40c16fa",
+"5e342ab40680a4375a7d38ae",
+"5e211d790680a43d5632efd5",
+"5cac55eac9ebc24597ac4507",
+"5d0983c8c9ebc2572aaaebeb",
+"5a9cbb7ec9ebc242498f1a2b",
+"58bb94acc9ebc2524b636ffa",
+"5d37d3c9c9ebc2572aadcae9",
+"5c4e69f4c9ebc261b2b3a66d",
+"5e608e0ec9ebc2058908a6a1",
+"5e84327ec9ebc24a4988d831",
+"5ea93acc0680a40ca3988925",
+"5f87b2017184870c9f95c4fc",
+"5f96737a0680a47eec55dc8b",
+"5f977d996fa1c2e2067a4566",
+"606d3a2f60ab4f174a28e5d6",
+"5f437a5facc2e73af64e5a0b",
+"5f6076b0acc2e775c84859f9",
+"57396f80c9ebc21532000013",
+"5ab49a20c9ebc25f942a1998",
+"572c741ec9ebc2520a000002",
+"581d6776c9ebc235dd000010",
+"5a80a66fc9ebc23e1a835675",
+"55934dccaf53742d43000244",
+"5e0aa2ebc9ebc20589067a68",
+"5b060671c9ebc2635c1e21b1",
+"5ff7d8800680a4164f350086",
+"60126749649536a3fdd61404",
+"5c64fffec9ebc230e8d29536",
+"5b95cf7bc9ebc2082f28bb2d",
+"577cb280c9ebc22fc5000100",
+"5fb2038c0680a420120fa1b0",
+"5fb20d11ab10e5625f329d41",
+"58c2481cc9ebc2336aa70934",
+"5b98a8acc9ebc2082f28fd8f",
+"5b98d33fc9ebc213a79ff4bb",
+"5fa20eeff4454ac6264d7638",
+"59b1f74fc9ebc23daa000001",
+"5cc02842c9ebc2227593893d",
+"572c6beec9ebc23e17000083",
+"5a9c9e1dc9ebc242498f1a23",
+"5d525b1ac9ebc2453288d05f",
+"5e4a85100680a46d69286a1b",
+"6041c6bbfa66305e9dba38d2",
+"5c6cc27bc9ebc230e8d2b4f5",
+"5c6f8f28c9ebc250b1851f6b",
+"5f20dfe3acc2e7041e3e71e6",
+"6041cb18fa66305e9dba3d1f",
+"5c2445f1c9ebc21f94390920",
+"5e7afb32c9ebc22451ba0a0d",
+"607ce17f9cd43920ee470f0a",
+"56a5d1b6af5374631c000029",
+"5e1da15dc9ebc2058907241e",
+"5eba540d0680a41587be364a",
+"5e82ede8c9ebc22451ba0a1b",
+"5f157fedacc2e71cd0047fa6",
+"5b738c0fc9ebc25ede01602a",
+"5f4376f1f3a5e11b436223bd",
+"60741053e775e23b53e06893",
+"6010d944aac8015130ae06d5",
+"5bfce06ac9ebc24c97bd791c",
+"5e4a848c0680a46d69286a17",
+"5e4a85410680a46d69286a1e",
+"5d4e45a20680a44ee79433d5",
+"5db67e310680a428d8470b91",
+"57d33b93c9ebc2509b00016c",
+"5df44523c9ebc229ddec8082",
+"5cdcf91fc9ebc228aeb6e3f7",
+"60780f22ff19bb16d9d36641",
+"5b8f9f9cc9ebc21688697d70",
+"5d9fdd190680a44742d9a9b9",
+"6049c59ea06bc2cb21d517a1",
+"5bfca158c9ebc242cc2d5672",
+"5de79e16c9ebc20658748bb3",
+"5d1c1fe5c9ebc2572aac1ca0",
+"608917d1f0a0ba030e9a5889",
+"6098e1924ec4ad11d809b7b0",
+"6098e7fe84d3c0cee316bfae",
+"60a11f0a1f932e158c1ae904",
+"5ab07b50c9ebc229d173b5f1",
+"5dd6334d0680a4099fdfe7a7",
+"5a9c93bec9ebc242498f1a1e",
+"5ef1e73bacc2e76bb4d9fa06",
+"5f489241acc2e732a4b7223d",
+"5f489b0eacc2e732a4b7224c",
+"5f48bb92acc2e75786baebb2",
+"602f6f9aacc2e74faa830a81",
+"5f573c55acc2e72044dab9b9",
+"607907f9e7d59e39d8275444",
+"60c847b8ef73458bae7da258",
+"60c08b5e85c57b2da722ce58",
+"60c03604ef1fca1e37704d10",
+"5b988c2cc9ebc2082f28fae6",
+"57d900d1c9ebc22f2700001d",
+"60d15b6a151d0408d02c5177",
+"60c9b51157cbee8bd628cd5f",
+"60efabf2c2da4841e756b852",
+"58845b31c9ebc24d7d588ec9",
+"60d2e4f016492c49cd2ad5fc",
+"610a301443aa80de31962fe5",
+"610a3b8543aa80de319b90d7",
+"6078eb9caa4999eaa77e484c",
+"592561e3c9ebc2720eca8432",
+"60ac52bbfc134fd03743d286",
+"60d2e307151d0408d04d1df4",
+"6115ea0e758c035e941bc09b",
+"6136fe99fc9d26d54bf9bbb8",
+"60c31cb5ef73458bae5d7c03",
+"61308b8167b322e57b7c4151",
+"61381e09ada15fcc0ae23e11",
+"5b593a87c9ebc27f0b4aa6cd",
+"60ee812b85454cd936604a59",
+"606c196fff19bb16d951f2d0",
+"6108e87b6ba2db87d66fb844",
+"60ca9f5257cbee8bd628d699",
+"60d151f6d460747be83f36cd",
+"6179060ce036ef1f1a434ac2",
+"615550fb61a2394488a90880",
+"56a847baaf53741b200003c5",
+"612f36a61c7834c195cafe37",
+"612347c885d24164e25e9fa8",
+"60867a0df0a0ba030e9a462b",
+"5ece0e020680a463ccecfc58",
+"6194984b93063e782c68b2a9",
+"60d1ac2ed460747be859d19a",
+"60e7f4977404a43638e6ebee",
+"619087f938bfb30c9170b8ad",
+"6141568ff2e093e2c504b16a",
+"607904b830942b76d711334c",
+"611b4561758c035e941bd9c6",
+"6177781038bfb30c91701245",
+"6178fecc38bfb30c91701cda",
+"61e119250df684118c521a91",
+"60b98edc85c57b2da722cd12",
+"608b7399f3a5e127022b065e",
+"6093654b02505f78a580ad73",
+"60b995a385c57b2da722cd3a",
+"6155c4dad7b4b50d7b888fa5",
+"5ae422b8c9ebc21437411c5e",
+"61949666ec15d391bb8482f9",
+"616e1fa1d0f6546b95ce725d",
+"5fd9b5df42e9d168790727a3",
+"612f36a61c7834c195cafe32",
+"612f36a61c7834c195cafe33",
+"60e3b730906206d2747aaac1",
+"612f36a61c7834c195cafe34",
+"612f36a61c7834c195cafe35",
+"5fbc6672018581c28646196a",
+"612f36a61c7834c195cafe36",
+"5f539ffa0680a47c545b0136",
+"5ef7e38a0680a42c937a4ddc",
+"5f0fb6f00680a40db53ea5cf",
+"563ff69faf537467fc000008",
+"612f36a61c7834c195cafe38",
+"612f36a61c7834c195cafe39",
+"612f36a61c7834c195cafe3a",
+"612f36a61c7834c195cafe3b",
+"612f36a61c7834c195cafe3c",
+"5f0bfd8dc9ebc276f4587bbf",
+"612f36a61c7834c195cafe3d",
+"612f36a61c7834c195cafe3e",
+"61288ed85805b0b729eb6259",
+"612f36a61c7834c195cafe3f",
+"612f36a61c7834c195cafe40",
+"5c663a02c9ebc21808726c72",
+"5d8c36b20680a4528056ebb6",
+"60bf7e9a57cbee8bd6289910",
+"612f36a61c7834c195cafe41",
+"612f36a61c7834c195cafe42",
+"612f36a61c7834c195cafe43",
+"5ef815750680a42c937a99e6",
+"612f36a61c7834c195cafe44",
+"612f36a61c7834c195cafe45",
+"612f36a61c7834c195cafe46",
+"612f36a61c7834c195cafe47",
+"612f36a61c7834c195cafe48",
+"612f36a61c7834c195cafe49",
+"612f36a61c7834c195cafe4a",
+"612f36a61c7834c195cafe4b",
+"5b55842cc9ebc25577913dfd",
+"57d1346fc9ebc2509b0000b5",
+"612f36a61c7834c195cafe4c",
+"612f36a61c7834c195cafe4d",
+"5cfdd931c9ebc2572aaa7bd3",
+"612f36a61c7834c195cafe4e",
+"612f36a61c7834c195cafe4f",
+"612f36a61c7834c195cafe50",
+"612f36a61c7834c195cafe51",
+"60e2a271c3b1e3795853748f",
+"5df6d7afc9ebc229ddec92b2")
+
+```
+mongo库处理 
 
+```
+db.user.updateMany({"_id" :{$in: [替换为用户objectid,...]}},{"$set":{"user_type":2}},true)
+db.user.updateMany({"_id" :{$in: [ObjectId("5be90fc8c9ebc242cc2ca055"),
+ObjectId("5be90f7cc9ebc242cc2ca04f"),
+ObjectId("5dd806fe0680a44dd614fcc4"),
+ObjectId("5eaa2577c9ebc20648b2ac44"),
+ObjectId("5d2c26aec9ebc2572aad00fb"),
+ObjectId("585cc52fc9ebc23d92000014"),
+ObjectId("5a8064acc9ebc21b9cdd5945"),
+ObjectId("5e4a94330680a46d69286a7d"),
+ObjectId("5aa63391c9ebc21749d7facb"),
+ObjectId("5b8c9507c9ebc2168dd8f9cf"),
+ObjectId("5ea4ff550680a45c42b223a0"),
+ObjectId("5b5ac420c9ebc27f0b4ad2b6"),
+ObjectId("5e86f725c9ebc22451ba0aef"),
+ObjectId("5b7e2145c9ebc22d1c8322e4"),
+ObjectId("5c3ecf30c9ebc245590dc5fa"),
+ObjectId("5cc558f0c9ebc266c890c3dc"),
+ObjectId("5c64d2a1c9ebc250b1851f54"),
+ObjectId("5d0da4080680a424f070178a"),
+ObjectId("5f9a1f220680a47eec55eadf"),
+ObjectId("56fb8e6aaf537416e000000a"),
+ObjectId("581858dbc9ebc2132200002e"),
+ObjectId("5ea107c30680a45c42b20aa8"),
+ObjectId("60459ab4196e44e6dc0cb9b7"),
+ObjectId("60582a63945ce516737f1147"),
+ObjectId("5f817034ab6fddc7783dc3bf"),
+ObjectId("5d42c182c9ebc2453288012b"),
+ObjectId("5cbd5135c9ebc24597acc2f0"),
+ObjectId("5cbd4dc7c9ebc231f5f7c762"),
+ObjectId("5638254eaf53741bfc000052"),
+ObjectId("5e8c48d70680a473b141fc08"),
+ObjectId("5fc5b835d394daefa24e7c34"),
+ObjectId("5a9f6d18c9ebc2494eb5db07"),
+ObjectId("5d8427a2c9ebc24f3530c643"),
+ObjectId("5f237535c9ebc276f45952f0"),
+ObjectId("5f295ef8acc2e7041e3e9774"),
+ObjectId("5af297c8c9ebc245cdee7f59"),
+ObjectId("5c3bfccdc9ebc245590db6d9"),
+ObjectId("5bee1fa3c9ebc24b7110da8a"),
+ObjectId("5c10d576c9ebc20f2ee6cfed"),
+ObjectId("5b694d1bc9ebc219e40c16fa"),
+ObjectId("5e342ab40680a4375a7d38ae"),
+ObjectId("5e211d790680a43d5632efd5"),
+ObjectId("5cac55eac9ebc24597ac4507"),
+ObjectId("5d0983c8c9ebc2572aaaebeb"),
+ObjectId("5a9cbb7ec9ebc242498f1a2b"),
+ObjectId("58bb94acc9ebc2524b636ffa"),
+ObjectId("5d37d3c9c9ebc2572aadcae9"),
+ObjectId("5c4e69f4c9ebc261b2b3a66d"),
+ObjectId("5e608e0ec9ebc2058908a6a1"),
+ObjectId("5e84327ec9ebc24a4988d831"),
+ObjectId("5ea93acc0680a40ca3988925"),
+ObjectId("5f87b2017184870c9f95c4fc"),
+ObjectId("5f96737a0680a47eec55dc8b"),
+ObjectId("5f977d996fa1c2e2067a4566"),
+ObjectId("606d3a2f60ab4f174a28e5d6"),
+ObjectId("5f437a5facc2e73af64e5a0b"),
+ObjectId("5f6076b0acc2e775c84859f9"),
+ObjectId("57396f80c9ebc21532000013"),
+ObjectId("5ab49a20c9ebc25f942a1998"),
+ObjectId("572c741ec9ebc2520a000002"),
+ObjectId("581d6776c9ebc235dd000010"),
+ObjectId("5a80a66fc9ebc23e1a835675"),
+ObjectId("55934dccaf53742d43000244"),
+ObjectId("5e0aa2ebc9ebc20589067a68"),
+ObjectId("5b060671c9ebc2635c1e21b1"),
+ObjectId("5ff7d8800680a4164f350086"),
+ObjectId("60126749649536a3fdd61404"),
+ObjectId("5c64fffec9ebc230e8d29536"),
+ObjectId("5b95cf7bc9ebc2082f28bb2d"),
+ObjectId("577cb280c9ebc22fc5000100"),
+ObjectId("5fb2038c0680a420120fa1b0"),
+ObjectId("5fb20d11ab10e5625f329d41"),
+ObjectId("58c2481cc9ebc2336aa70934"),
+ObjectId("5b98a8acc9ebc2082f28fd8f"),
+ObjectId("5b98d33fc9ebc213a79ff4bb"),
+ObjectId("5fa20eeff4454ac6264d7638"),
+ObjectId("59b1f74fc9ebc23daa000001"),
+ObjectId("5cc02842c9ebc2227593893d"),
+ObjectId("572c6beec9ebc23e17000083"),
+ObjectId("5a9c9e1dc9ebc242498f1a23"),
+ObjectId("5d525b1ac9ebc2453288d05f"),
+ObjectId("5e4a85100680a46d69286a1b"),
+ObjectId("6041c6bbfa66305e9dba38d2"),
+ObjectId("5c6cc27bc9ebc230e8d2b4f5"),
+ObjectId("5c6f8f28c9ebc250b1851f6b"),
+ObjectId("5f20dfe3acc2e7041e3e71e6"),
+ObjectId("6041cb18fa66305e9dba3d1f"),
+ObjectId("5c2445f1c9ebc21f94390920"),
+ObjectId("5e7afb32c9ebc22451ba0a0d"),
+ObjectId("607ce17f9cd43920ee470f0a"),
+ObjectId("56a5d1b6af5374631c000029"),
+ObjectId("5e1da15dc9ebc2058907241e"),
+ObjectId("5eba540d0680a41587be364a"),
+ObjectId("5e82ede8c9ebc22451ba0a1b"),
+ObjectId("5f157fedacc2e71cd0047fa6"),
+ObjectId("5b738c0fc9ebc25ede01602a"),
+ObjectId("5f4376f1f3a5e11b436223bd"),
+ObjectId("60741053e775e23b53e06893"),
+ObjectId("6010d944aac8015130ae06d5"),
+ObjectId("5bfce06ac9ebc24c97bd791c"),
+ObjectId("5e4a848c0680a46d69286a17"),
+ObjectId("5e4a85410680a46d69286a1e"),
+ObjectId("5d4e45a20680a44ee79433d5"),
+ObjectId("5db67e310680a428d8470b91"),
+ObjectId("57d33b93c9ebc2509b00016c"),
+ObjectId("5df44523c9ebc229ddec8082"),
+ObjectId("5cdcf91fc9ebc228aeb6e3f7"),
+ObjectId("60780f22ff19bb16d9d36641"),
+ObjectId("5b8f9f9cc9ebc21688697d70"),
+ObjectId("5d9fdd190680a44742d9a9b9"),
+ObjectId("6049c59ea06bc2cb21d517a1"),
+ObjectId("5bfca158c9ebc242cc2d5672"),
+ObjectId("5de79e16c9ebc20658748bb3"),
+ObjectId("5d1c1fe5c9ebc2572aac1ca0"),
+ObjectId("608917d1f0a0ba030e9a5889"),
+ObjectId("6098e1924ec4ad11d809b7b0"),
+ObjectId("6098e7fe84d3c0cee316bfae"),
+ObjectId("60a11f0a1f932e158c1ae904"),
+ObjectId("5ab07b50c9ebc229d173b5f1"),
+ObjectId("5dd6334d0680a4099fdfe7a7"),
+ObjectId("5a9c93bec9ebc242498f1a1e"),
+ObjectId("5ef1e73bacc2e76bb4d9fa06"),
+ObjectId("5f489241acc2e732a4b7223d"),
+ObjectId("5f489b0eacc2e732a4b7224c"),
+ObjectId("5f48bb92acc2e75786baebb2"),
+ObjectId("602f6f9aacc2e74faa830a81"),
+ObjectId("5f573c55acc2e72044dab9b9"),
+ObjectId("607907f9e7d59e39d8275444"),
+ObjectId("60c847b8ef73458bae7da258"),
+ObjectId("60c08b5e85c57b2da722ce58"),
+ObjectId("60c03604ef1fca1e37704d10"),
+ObjectId("5b988c2cc9ebc2082f28fae6"),
+ObjectId("57d900d1c9ebc22f2700001d"),
+ObjectId("60d15b6a151d0408d02c5177"),
+ObjectId("60c9b51157cbee8bd628cd5f"),
+ObjectId("60efabf2c2da4841e756b852"),
+ObjectId("58845b31c9ebc24d7d588ec9"),
+ObjectId("60d2e4f016492c49cd2ad5fc"),
+ObjectId("610a301443aa80de31962fe5"),
+ObjectId("610a3b8543aa80de319b90d7"),
+ObjectId("6078eb9caa4999eaa77e484c"),
+ObjectId("592561e3c9ebc2720eca8432"),
+ObjectId("60ac52bbfc134fd03743d286"),
+ObjectId("60d2e307151d0408d04d1df4"),
+ObjectId("6115ea0e758c035e941bc09b"),
+ObjectId("6136fe99fc9d26d54bf9bbb8"),
+ObjectId("60c31cb5ef73458bae5d7c03"),
+ObjectId("61308b8167b322e57b7c4151"),
+ObjectId("61381e09ada15fcc0ae23e11"),
+ObjectId("5b593a87c9ebc27f0b4aa6cd"),
+ObjectId("60ee812b85454cd936604a59"),
+ObjectId("606c196fff19bb16d951f2d0"),
+ObjectId("6108e87b6ba2db87d66fb844"),
+ObjectId("60ca9f5257cbee8bd628d699"),
+ObjectId("60d151f6d460747be83f36cd"),
+ObjectId("6179060ce036ef1f1a434ac2"),
+ObjectId("615550fb61a2394488a90880"),
+ObjectId("56a847baaf53741b200003c5"),
+ObjectId("612f36a61c7834c195cafe37"),
+ObjectId("612347c885d24164e25e9fa8"),
+ObjectId("60867a0df0a0ba030e9a462b"),
+ObjectId("5ece0e020680a463ccecfc58"),
+ObjectId("6194984b93063e782c68b2a9"),
+ObjectId("60d1ac2ed460747be859d19a"),
+ObjectId("60e7f4977404a43638e6ebee"),
+ObjectId("619087f938bfb30c9170b8ad"),
+ObjectId("6141568ff2e093e2c504b16a"),
+ObjectId("607904b830942b76d711334c"),
+ObjectId("611b4561758c035e941bd9c6"),
+ObjectId("6177781038bfb30c91701245"),
+ObjectId("6178fecc38bfb30c91701cda"),
+ObjectId("61e119250df684118c521a91"),
+ObjectId("60b98edc85c57b2da722cd12"),
+ObjectId("608b7399f3a5e127022b065e"),
+ObjectId("6093654b02505f78a580ad73"),
+ObjectId("60b995a385c57b2da722cd3a"),
+ObjectId("6155c4dad7b4b50d7b888fa5"),
+ObjectId("5ae422b8c9ebc21437411c5e"),
+ObjectId("61949666ec15d391bb8482f9"),
+ObjectId("616e1fa1d0f6546b95ce725d"),
+ObjectId("5fd9b5df42e9d168790727a3"),
+ObjectId("612f36a61c7834c195cafe32"),
+ObjectId("612f36a61c7834c195cafe33"),
+ObjectId("60e3b730906206d2747aaac1"),
+ObjectId("612f36a61c7834c195cafe34"),
+ObjectId("612f36a61c7834c195cafe35"),
+ObjectId("5fbc6672018581c28646196a"),
+ObjectId("612f36a61c7834c195cafe36"),
+ObjectId("5f539ffa0680a47c545b0136"),
+ObjectId("5ef7e38a0680a42c937a4ddc"),
+ObjectId("5f0fb6f00680a40db53ea5cf"),
+ObjectId("563ff69faf537467fc000008"),
+ObjectId("612f36a61c7834c195cafe38"),
+ObjectId("612f36a61c7834c195cafe39"),
+ObjectId("612f36a61c7834c195cafe3a"),
+ObjectId("612f36a61c7834c195cafe3b"),
+ObjectId("612f36a61c7834c195cafe3c"),
+ObjectId("5f0bfd8dc9ebc276f4587bbf"),
+ObjectId("612f36a61c7834c195cafe3d"),
+ObjectId("612f36a61c7834c195cafe3e"),
+ObjectId("61288ed85805b0b729eb6259"),
+ObjectId("612f36a61c7834c195cafe3f"),
+ObjectId("612f36a61c7834c195cafe40"),
+ObjectId("5c663a02c9ebc21808726c72"),
+ObjectId("5d8c36b20680a4528056ebb6"),
+ObjectId("60bf7e9a57cbee8bd6289910"),
+ObjectId("612f36a61c7834c195cafe41"),
+ObjectId("612f36a61c7834c195cafe42"),
+ObjectId("612f36a61c7834c195cafe43"),
+ObjectId("5ef815750680a42c937a99e6"),
+ObjectId("612f36a61c7834c195cafe44"),
+ObjectId("612f36a61c7834c195cafe45"),
+ObjectId("612f36a61c7834c195cafe46"),
+ObjectId("612f36a61c7834c195cafe47"),
+ObjectId("612f36a61c7834c195cafe48"),
+ObjectId("612f36a61c7834c195cafe49"),
+ObjectId("612f36a61c7834c195cafe4a"),
+ObjectId("612f36a61c7834c195cafe4b"),
+ObjectId("5b55842cc9ebc25577913dfd"),
+ObjectId("57d1346fc9ebc2509b0000b5"),
+ObjectId("612f36a61c7834c195cafe4c"),
+ObjectId("612f36a61c7834c195cafe4d"),
+ObjectId("5cfdd931c9ebc2572aaa7bd3"),
+ObjectId("612f36a61c7834c195cafe4e"),
+ObjectId("612f36a61c7834c195cafe4f"),
+ObjectId("612f36a61c7834c195cafe50"),
+ObjectId("612f36a61c7834c195cafe51"),
+ObjectId("60e2a271c3b1e3795853748f"),
+ObjectId("5df6d7afc9ebc229ddec92b2")]}},{"$set":{"user_type":2}},true)
+
+```

+ 2 - 1
src/config.json

@@ -108,5 +108,6 @@
     "password": "Tidb#20220214",
     "address": "192.168.3.109:4000",
     "dbName": "callCenter"
-  }
+  },
+  "smsServiceRpc": "127.0.0.1:932"
 }

+ 1 - 0
src/config/config.go

@@ -52,6 +52,7 @@ type SysConfig struct {
 	Tidb           string                 `json:"tidb"`
 	LookAllMsg     map[string]bool        `json:"lookAllMsg"`
 	CusTidbMysql   map[string]interface{} `json:"cusTidbMysql"`
+	SmsServiceRpc  string                 `json:"smsServiceRpc"`
 }
 
 var SysConfigs SysConfig

+ 37 - 16
src/customerService/customController.go

@@ -12,20 +12,23 @@ import (
 )
 
 type customMsg struct {
-	Id         int                      `form:"id"`         //消息id
-	MsgType    int                      `form:"msgType"`    //消息类型
-	Title      string                   `form:"title"`      //标题
-	Content    string                   `form:"content"`    //内容
-	Link       string                   `form:"link"`       //链接
-	SendMode   int                      `form:"sendMode"`   //发送时效 发送模式  1- 定时 2-实时
-	SendTime   string                   `form:"sendTime"`   // 发送时间
-	AndroidUrl string                   `form:"androidUrl"` //安卓连接
-	IosUrl     string                   `form:"iosUrl"`     //ios连接
-	WeChatUrl  string                   `form:"weChatUrl"`  //微信连接
-	UserIds    string                   `form:"userIds"`    //发送用户id
-	UserArr    []map[string]interface{} `form:"userArr"`
+	Id           int                      `form:"id"`           //消息id
+	MsgType      int                      `form:"msgType"`      //消息类型
+	Title        string                   `form:"title"`        //标题
+	Content      string                   `form:"content"`      //内容
+	Link         string                   `form:"link"`         //链接
+	SendMode     int                      `form:"sendMode"`     //发送时效 发送模式  1- 定时 2-实时
+	SendTime     string                   `form:"sendTime"`     //发送时间
+	AndroidUrl   string                   `form:"androidUrl"`   //安卓连接
+	IosUrl       string                   `form:"iosUrl"`       //ios连接
+	WeChatUrl    string                   `form:"weChatUrl"`    //微信连接
+	UserIds      string                   `form:"userIds"`      //发送用户id
+	UserArr      []map[string]interface{} `form:"userArr"`      //已选择的用户信息集合
+	UserAddWay   int                      `form:"userAddWay"`   //添加用户的方式
+	TemplateName string                   `form:"templateName"` //模板名称 - 自定义消息
 }
 
+// CustomSendMsg 自定义发送消息
 func CustomSendMsg(context *admin.Context) (interface{}, error) {
 	param := &customMsg{}
 	err := context.Form(param)
@@ -45,6 +48,7 @@ func CustomSendMsg(context *admin.Context) (interface{}, error) {
 	}, err
 }
 
+// MyCustomerList 自定义发送消息中我的客户列表
 func MyCustomerList(context *admin.Context) (interface{}, error) {
 	param := new(struct {
 		State           string `form:"state"`           //客户状态
@@ -58,6 +62,7 @@ func MyCustomerList(context *admin.Context) (interface{}, error) {
 	if err != nil {
 		return nil, err
 	}
+	log.Println(param)
 	adminPhone := context.User.Phone
 	count, data := MyCustomerService(param.State, param.UpdateTimeStart, param.UpdateTimeEnd, param.CompanyName, param.Phone, adminPhone, param.Page.Offset, param.Page.PageSize)
 	return map[string]interface{}{
@@ -66,6 +71,7 @@ func MyCustomerList(context *admin.Context) (interface{}, error) {
 	}, nil
 }
 
+// SingleAdd 逐一添加
 func SingleAdd(context *admin.Context) (interface{}, error) {
 	param := new(struct {
 		UserId string `form:"userId"`
@@ -85,8 +91,8 @@ func SingleAdd(context *admin.Context) (interface{}, error) {
 			phone = qutil.ObjToString((*userData)["s_m_phone"])
 		}
 		return map[string]interface{}{
-			"userId":        param.UserId,
-			"registerPhone": phone,
+			"userId": param.UserId,
+			"phone":  phone,
 		}, nil
 	}
 	return nil, errors.New("添加失败,无此用户")
@@ -193,7 +199,7 @@ func ImportUser(context *admin.Context) (interface{}, error) {
 		"recordCount":  recordCount,  // 识别数量
 		"successCount": successCount, // 成功数量
 		"errCount":     errCount,     // 失败数量
-		"datalist":     selectUser,   // 读取到的用户id信息
+		"list":         selectUser,   // 读取到的用户id信息
 		"errUrl":       url,          // 失败的原因
 	}
 	return returnRs, nil
@@ -209,6 +215,21 @@ func GetUserInfo(context *admin.Context) (interface{}, error) {
 	if err != nil {
 		return nil, err
 	}
-	userData := FindUserInfo(param.MsgId, param.Page.Offset, param.Page.PageSize)
+	userData, total := FindUserInfo(param.MsgId, param.Page.Offset, param.Page.PageSize)
+	return map[string]interface{}{
+		"lists": userData,
+		"total": total,
+	}, nil
+}
+
+func GetUserIds(context *admin.Context) (interface{}, error) {
+	param := new(struct {
+		MsgId int `form:"msgId"`
+	})
+	err := context.Form(param)
+	if err != nil {
+		return nil, err
+	}
+	userData := FindUserIds(param.MsgId)
 	return userData, nil
 }

+ 138 - 56
src/customerService/customService.go

@@ -23,20 +23,23 @@ func CustomSendMsgService(param *customMsg, sendStatus int, loginUserName string
 	if param.SendMode == 2 {
 		param.SendTime = time.Now().Format(qutil.Date_Full_Layout)
 	}
+	fields := []string{"user_id", "register_phone", "call_center_company", "call_center_phone", "createtime", "msg_id"}
 	// 更新消息
 	if param.Id != 0 {
-
 		msgLogId = strconv.Itoa(param.Id)
 		isOk := util.JysqlDB.ExecTx("更新消息出错", func(tx *sql.Tx) bool {
 			ok1 := util.JysqlDB.Delete("sendmsg_customer_info", map[string]interface{}{"msg_id": param.Id})
-			var fields []string
 			var args []interface{}
 			for _, val := range param.UserArr {
-				for k, v := range val {
-					fields = append(fields, k)
-					args = append(args, v)
-				}
+				args = append(args, val["user_id"])
+				args = append(args, val["register_phone"])
+				args = append(args, val["call_center_company"])
+				args = append(args, val["call_center_phone"])
+				args = append(args, time.Now().Format(qutil.Date_Full_Layout))
+				args = append(args, param.Id)
 			}
+			log.Println(fields)
+			log.Println(args)
 			count, _ := util.JysqlDB.InsertBatch("sendmsg_customer_info", fields, args)
 			ok := util.JysqlDB.Update("message_send_log", map[string]interface{}{"id": param.Id}, map[string]interface{}{
 				"send_usergroup_id":   "",
@@ -52,6 +55,9 @@ func CustomSendMsgService(param *customMsg, sendStatus int, loginUserName string
 				"link":                param.Link,
 				"isdel":               1,
 				"send_userid":         loginUserId,
+				"user_add_way":        param.UserAddWay,
+				"template_name":       param.TemplateName,
+				"update_user":         loginUserName,
 			})
 			return ok1 && ok && count > 0
 		})
@@ -83,25 +89,54 @@ func CustomSendMsgService(param *customMsg, sendStatus int, loginUserName string
 		return 1, nil
 	} else {
 		//保存发送的消息
+		var msgId int64
 		log.Println("发送消息发送时间:", param.SendTime)
-		msgId := util.JysqlDB.Insert("message_send_log", map[string]interface{}{
-			"send_usergroup_id":   "",
-			"send_usergroup_name": "",
-			// "receive_user_id":     userIdStr,
-			"msg_type":    param.MsgType,
-			"title":       param.Title,
-			"content":     param.Content,
-			"send_mode":   param.SendMode,
-			"send_time":   param.SendTime,
-			"send_status": sendStatus,
-			"update_time": time.Now().Format(qutil.Date_Full_Layout),
-			"createtime":  time.Now().Format(qutil.Date_Full_Layout),
-			"link":        param.Link,
-			"isdel":       1,
-			"send_userid": loginUserId,
-			"send_name":   loginUserName,
-			"sign":        1,
+		isOk := util.JysqlDB.ExecTx("更新消息出错", func(tx *sql.Tx) bool {
+			msgId = util.JysqlDB.Insert("message_send_log", map[string]interface{}{
+				"send_usergroup_id":   "",
+				"send_usergroup_name": "",
+				// "receive_user_id":     userIdStr,
+				"msg_type":      param.MsgType,
+				"title":         param.Title,
+				"content":       param.Content,
+				"send_mode":     param.SendMode,
+				"send_time":     param.SendTime,
+				"send_status":   sendStatus,
+				"update_time":   time.Now().Format(qutil.Date_Full_Layout),
+				"createtime":    time.Now().Format(qutil.Date_Full_Layout),
+				"link":          param.Link,
+				"isdel":         1,
+				"send_userid":   loginUserId,
+				"send_name":     loginUserName,
+				"sign":          1,
+				"user_add_way":  param.UserAddWay,
+				"template_name": param.TemplateName,
+				"update_user":   loginUserName,
+			})
+
+			var args []interface{}
+			for _, val := range param.UserArr {
+				args = append(args, val["user_id"])
+				args = append(args, val["register_phone"])
+				args = append(args, val["call_center_company"])
+				args = append(args, val["call_center_phone"])
+				args = append(args, time.Now().Format(qutil.Date_Full_Layout))
+				args = append(args, msgId)
+			}
+			log.Println(fields)
+			log.Println(args)
+			count, _ := util.JysqlDB.InsertBatch("sendmsg_customer_info", fields, args)
+			/*var in_ok int64
+			log.Println("选择用户数量:", len(param.UserArr))
+			for _, val := range param.UserArr {
+				val["msg_id"] = msgId
+				in_ok = util.JysqlDB.InsertByTx(tx, "sendmsg_customer_info", val)
+			}*/
+			return msgId > -1 && count > 0
 		})
+		if !isOk {
+			return 0, errors.New("保存消息出错")
+		}
 		msgLogId = strconv.FormatInt(msgId, 10)
 		//如果是定时发送
 		if param.SendMode == 1 {
@@ -223,37 +258,65 @@ func CustomSendMsgService(param *customMsg, sendStatus int, loginUserName string
 	return 0, errors.New("发送消息出错")
 }
 
-func MyCustomerService(state, updateTimeStart, updateTimeEnd, companyName, phone, adminPhone string, offSet, pageSize int) (count int64, data *[]map[string]interface{}) {
-	sql := "SELECT * FROM customer where owner = '" + adminPhone + "' "
-	str := ""
-	sqlc := "SELECT COUNt(id) FROM customer where owner = '" + adminPhone + "' "
+func MyCustomerService(state, updateTimeStart, updateTimeEnd, companyName, phone, adminPhone string, offSet, pageSize int) (count int64, data []map[string]interface{}) {
+	salesperson := util.CusTiDb.FindOne("jy_salesperson_info", map[string]interface{}{"phone": adminPhone}, "seatNumber", "")
+	if salesperson != nil && len(*salesperson) > 0 {
+		code := qutil.ObjToString((*salesperson)["seatNumber"])
+		sqlStr := "SELECT company,id,phone,status999,lastUpdateTime FROM customer where owner in (" + code + ") "
+		str := ""
+		sqlc := "SELECT COUNT(*) FROM customer where owner in (" + code + ") "
 
-	if state != "" {
-		str += " and status999 = " + state
-	}
-	if updateTimeStart != "" {
-		str += " and lastUpdateTime >= " + updateTimeStart
-	}
-	if updateTimeEnd != "" {
-		str += " and lastUpdateTime < " + updateTimeEnd
-	}
-	if companyName != "" {
-		str += " and company = " + companyName
-	}
-	if phone != "" {
-		str += " and phone = " + phone
-	}
-	log.Println(sql, sqlc)
-	if str != "" {
-		sql += str + " order by id desc limit " + fmt.Sprint(offSet) + " " + "," + " " + fmt.Sprint(pageSize)
-		sqlc += str
-	}
-	log.Println("sql:", sql)
-	log.Println("sqlc:", sqlc)
-	count = util.CusTiDb.CountBySql(sqlc)
-	if count > 0 {
-		data = util.CusTiDb.SelectBySql(sql)
+		if state != "" && state != "0" {
+			str += " and status999 = '" + state + "'"
+		}
+		if updateTimeStart != "" {
+			str += " and lastUpdateTime >= '" + updateTimeStart + "'"
+		}
+		if updateTimeEnd != "" {
+			str += " and lastUpdateTime < '" + updateTimeEnd + "'"
+		}
+		if companyName != "" {
+			str += " and company like '%" + companyName + "%'"
+		}
+		if phone != "" {
+			str += " and phone like '%" + phone + "%'"
+		}
+		if str != "" {
+			sqlStr += str
+			sqlc += str
+		}
+		sqlStr += " order by lastUpdateTime desc limit " + fmt.Sprint(offSet) + " " + "," + " " + fmt.Sprint(pageSize)
+		log.Println("sql:", sqlStr)
+		log.Println("sqlc:", sqlc)
+		count = util.CusTiDb.CountBySql(sqlc)
+		if count > 0 {
+			res := util.CusTiDb.SelectBySql(sqlStr)
+			if res != nil && len(*res) > 0 {
+				for _, v := range *res {
+					userId := qutil.ObjToString(v["id"])
+					//获取用户注册手机号
+					if userId != "" {
+						userData, ok := util.MQFW.FindById("user", userId, `"s_phone":1,"s_m_phone":1`)
+						if userData != nil && len(*userData) > 0 && ok {
+							if qutil.ObjToString((*userData)["s_phone"]) != "" {
+								v["registePhone"] = qutil.ObjToString((*userData)["s_phone"])
+							} else {
+								v["registePhone"] = qutil.ObjToString((*userData)["s_m_phone"])
+							}
+						} else {
+							v["registePhone"] = ""
+						}
+					} else {
+						v["registePhone"] = ""
+					}
+					data = append(data, v)
+				}
+			}
+		}
+	} else {
+		log.Println("登陆人员暂无呼叫中心坐席号")
 	}
+
 	return count, data
 }
 
@@ -273,13 +336,14 @@ func SaveFile(rdata [][]interface{}, templatePath string, savePath string, saveN
 		row := sh.AddRow()
 		for j := 0; j < len(data); j++ {
 			row.AddCell().SetValue(data[j])
+			log.Println(data[j], "写入文件")
 		}
 	}
 	now := time.Now()
 	t := fmt.Sprintf("%d%d%d", now.Year(), now.Month(), now.Day())
 	dir := savePath + t + "/"
 	dirs := domainPath + t + "/"
-	if b := order.PathExists(savePath); !b {
+	if b := order.PathExists(dir); !b {
 		err1 := os.MkdirAll(dir, os.ModePerm)
 		if err1 != nil {
 			log.Println("mkdir err", dir)
@@ -288,9 +352,11 @@ func SaveFile(rdata [][]interface{}, templatePath string, savePath string, saveN
 	t2 := fmt.Sprintf("%d%d%d%d%d%d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
 
 	fileName := saveName + t2 + ".xlsx"
+	log.Println(dir + fileName)
 	err = xf.Save(dir + fileName)
+	log.Println(err)
 	url = qutil.ObjToString(config.SysConfigs.Domain) + dirs + fileName
-	return url, nil
+	return url, err
 }
 
 func GetUserById(id string) (userData *map[string]interface{}, ok bool) {
@@ -299,7 +365,23 @@ func GetUserById(id string) (userData *map[string]interface{}, ok bool) {
 	return userData, ok
 }
 
-func FindUserInfo(msgId int, offSet, pageSize int) *[]map[string]interface{} {
+func FindUserInfo(msgId int, offSet, pageSize int) (*[]map[string]interface{}, int64) {
 	users := util.JysqlDB.Find("sendmsg_customer_info", map[string]interface{}{"msg_id": msgId}, "", "createtime desc", offSet, pageSize)
-	return users
+	total := util.JysqlDB.Count("sendmsg_customer_info", map[string]interface{}{"msg_id": msgId})
+	return users, total
+}
+
+func FindUserIds(msgId int) string {
+	users := util.JysqlDB.Find("sendmsg_customer_info", map[string]interface{}{"msg_id": msgId}, "user_id", "createtime desc", -1, -1)
+	userIds := ""
+	if users != nil && len(*users) > 0 {
+		for k, val := range *users {
+			if k == len(*users)-1 {
+				userIds += qutil.ObjToString(val["user_id"])
+			} else {
+				userIds += qutil.ObjToString(val["user_id"]) + ","
+			}
+		}
+	}
+	return userIds
 }

+ 47 - 4
src/customerService/newsController.go

@@ -2,10 +2,12 @@ package customerService
 
 import (
 	"config"
-	"github.com/baiy/Cadmin-server-go/admin"
-	"github.com/baiy/Cadmin-server-go/system/utils"
+	"errors"
 	"log"
 	"strconv"
+
+	"github.com/baiy/Cadmin-server-go/admin"
+	"github.com/baiy/Cadmin-server-go/system/utils"
 )
 
 type MsgListParam struct {
@@ -17,6 +19,9 @@ type MsgListParam struct {
 	SendTimeEnd     string `form:"sendTimeEnd"`     //发送时间  ---查询截止
 	UpdateTimeStart string `form:"updateTimeStart"` //最近一次修改时间  --查询起始时间
 	UpdateTimeEnd   string `form:"updateTimeEnd"`   //最近一次修改时间  --查询截止时间
+	Creator         string `form:"creator"`         //创建人
+	UserId          string `form:"userId"`          //1 用户id  2 用户手机号
+	Phone           string `form:"phone"`           //注册手机号
 	utils.Page
 }
 
@@ -34,8 +39,20 @@ type Message struct {
 	IosUrl        string `form:"iosUrl"`        //ios连接
 	WeChatUrl     string `form:"weChatUrl"`     //微信连接
 }
+type SendMessage struct {
+	UserIds    string `form:"userIds"`
+	MsgType    int    `form:"msgType"`    //消息类型
+	Title      string `form:"title"`      //标题
+	Content    string `form:"content"`    //内容
+	Link       string `form:"link"`       //链接
+	SendMode   int    `form:"sendMode"`   //发送时效 发送模式  1- 定时 2-实时
+	SendTime   string `form:"sendTime"`   // 发送时间
+	AndroidUrl string `form:"androidUrl"` //安卓连接
+	IosUrl     string `form:"iosUrl"`     //ios连接
+	WeChatUrl  string `form:"weChatUrl"`  //微信连接
+}
 
-// MessageDetails 查看消息内容
+//查看消息内容
 func MessageDetails(context *admin.Context) (interface{}, error) {
 	param := new(struct {
 		Id int `form:"id"`
@@ -74,6 +91,7 @@ func MessageList(context *admin.Context) (interface{}, error) {
 	isLookAll := 0
 	lookAllMsgUser := config.SysConfigs.LookAllMsg
 	loginUserId := context.User.Id
+	loginUserName := context.User.Username
 	if ok := lookAllMsgUser[strconv.Itoa(loginUserId)]; ok {
 		isLookAll = 1
 	} else {
@@ -86,7 +104,7 @@ func MessageList(context *admin.Context) (interface{}, error) {
 		}
 	}
 	log.Println(isLookAll)
-	data, count := MsgList(param, isLookAll, loginUserId)
+	data, count := MsgList(param, isLookAll, loginUserId, loginUserName)
 	return map[string]interface{}{
 		"lists": data,
 		"total": count,
@@ -121,3 +139,28 @@ func GetGroup(context *admin.Context) (interface{}, error) {
 	}
 	return group, nil
 }
+
+//对外提供接口
+func SendMessageApi(context *admin.Context) (interface{}, error) {
+	param := &SendMessage{}
+	err := context.Form(param)
+	if err != nil {
+		return nil, nil
+	}
+	log.Println(param)
+	log.Println(param.UserIds)
+	if param.UserIds == "" {
+		return nil, errors.New("用户id为空,请确认参数是否完整")
+	}
+	//发送状态
+	sendStatus := 1 //
+	if param.SendMode == 2 {
+		sendStatus = 4
+	}
+	//拼接link
+	param.Link = param.Link + "," + param.AndroidUrl + "," + param.IosUrl + "," + param.WeChatUrl
+	status, err := pushMsg(param, sendStatus)
+	return map[string]interface{}{
+		"status": status,
+	}, err
+}

+ 174 - 18
src/customerService/newsService.go

@@ -51,7 +51,7 @@ func MsgDelete(id string) (int, error) {
 }
 
 func MsgDetail(id int) (*map[string]interface{}, error) {
-	info := util.JysqlDB.FindOne("message_send_log", map[string]interface{}{"id": id}, Str, "")
+	info := util.JysqlDB.FindOne("message_send_log", map[string]interface{}{"id": id}, "", "")
 	if info != nil && len(*info) > 0 {
 		link := qutil.ObjToString((*info)["link"])
 		log.Println("详情连接:", link)
@@ -67,49 +67,66 @@ func MsgDetail(id int) (*map[string]interface{}, error) {
 			(*info)["iosUrl"] = ""
 			(*info)["weChatUrl"] = ""
 		}
+		if qutil.IntAll((*info)["sign"]) == 1 || qutil.IntAll((*info)["sign"]) == 1 {
+			(*info)["send_usergroup_name"] = "自定义"
+		}
 		log.Println("消息详情信息:", *info)
 		return info, nil
 	}
 	return nil, errors.New("查询出错")
 }
 
-var Str = "id,send_usergroup_name,msg_type,title,content,send_mode,send_time,send_status,update_time,createtime,link,isdel,send_name,send_usergroup_id"
+var Str = "a.send_usergroup_name,a.msg_type,a.title,a.content,a.send_mode,a.send_time,a.send_status,a.update_time,a.createtime,a.link,a.isdel,a.send_name,a.send_usergroup_id,a.sign,a.user_add_way,a.template_name,a.user_add_way"
 
 //消息列表查询
-func MsgList(param *MsgListParam, isLookAllMsg, loginUserId int) (*[]map[string]interface{}, int) {
-	sql := "SELECT " + Str + " FROM message_send_log "
+func MsgList(param *MsgListParam, isLookAllMsg, loginUserId int, loginUserName string) (*[]map[string]interface{}, int) {
+	sql := "SELECT DISTINCT(a.id)," + Str + " FROM message_send_log as a LEFT JOIN sendmsg_customer_info as b on a.id = b.msg_id "
 	str := ""
-	sqlc := "SELECT COUNt(*) FROM message_send_log "
+	sqlc := "SELECT DISTINCT(COUNt(*)) FROM message_send_log as a  LEFT JOIN sendmsg_customer_info as b on a.id = b.msg_id "
 	if param.UserGroupName != "" {
-		str += " send_usergroup_name = '" + param.UserGroupName + "' and"
+		if param.UserGroupName == "自定义" {
+			str += " a.sign = 1 and"
+		} else {
+			str += " a.send_usergroup_name = '" + param.UserGroupName + "' and"
+		}
 	}
 	if param.MsgType != 0 {
-		str += " msg_type = " + strconv.Itoa(param.MsgType) + " and"
+		str += " a.msg_type = " + strconv.Itoa(param.MsgType) + " and"
 	}
 	if param.Title != "" {
-		str += " title like " + "'%" + param.Title + "%' and"
+		str += " a.title like " + "'%" + param.Title + "%' and"
 	}
 	if param.SendStatus != 0 {
-		str += " send_status = " + strconv.Itoa(param.SendStatus) + " and"
+		str += " a.send_status = " + strconv.Itoa(param.SendStatus) + " and"
 	}
 	if param.SendTimeStart != "" {
-		str += " send_time >= '" + param.SendTimeStart + " 00:00:00" + "' and"
+		str += " a.send_time >= '" + param.SendTimeStart + " 00:00:00" + "' and"
 	}
 	if param.SendTimeEnd != "" {
-		str += " send_time <= '" + param.SendTimeEnd + " 23:59:59" + "' and"
+		str += " a.send_time <= '" + param.SendTimeEnd + " 23:59:59" + "' and"
 	}
 	if param.UpdateTimeStart != "" {
-		str += " update_time >= '" + param.UpdateTimeStart + " 00:00:00" + "' and"
+		str += " a.update_time >= '" + param.UpdateTimeStart + " 00:00:00" + "' and"
 	}
 	if param.UpdateTimeEnd != "" {
-		str += " update_time <= '" + param.UpdateTimeEnd + " 23:59:59" + "' and"
+		str += " a.update_time <= '" + param.UpdateTimeEnd + " 23:59:59" + "' and"
 	}
 	if isLookAllMsg == 0 {
-		str += " send_userid = " + strconv.Itoa(loginUserId) + " and"
+		str += " a.send_userid = " + strconv.Itoa(loginUserId) + " and"
+	} else {
+		if param.Creator != "" {
+			str += " a.send_name = '" + loginUserName + "' and"
+		}
+	}
+	if param.Phone != "" {
+		str += " b.register_phone like '%" + param.Phone + "%' and"
+	}
+	if param.UserId != "" {
+		str += " b.user_id like '%" + param.UserId + "%' and"
 	}
-	page := " order by id desc limit " + fmt.Sprint(param.Page.Offset) + " " + "," + " " + fmt.Sprint(param.Page.PageSize)
-	sql += " WHERE isdel = 1 and"
-	sqlc += " WHERE isdel = 1 and"
+	page := " order by a.id desc limit " + fmt.Sprint(param.Page.Offset) + " " + "," + " " + fmt.Sprint(param.Page.PageSize)
+	sql += " WHERE a.isdel = 1 and"
+	sqlc += " WHERE a.isdel = 1 and"
 	if str != "" {
 		str = str[:len(str)-3]
 		sql += str
@@ -552,6 +569,7 @@ func SendMsg(param *Message, sendStatus int, loginUserName string, loginUserId i
 			"link":        param.Link,
 			"isdel":       1,
 			"send_userid": loginUserId,
+			"update_user": loginUserName,
 		})
 		if !ok {
 			return 0, errors.New("发送消息出错")
@@ -598,6 +616,7 @@ func SendMsg(param *Message, sendStatus int, loginUserName string, loginUserId i
 			"send_userid": loginUserId,
 			"send_name":   loginUserName,
 			"sign":        0,
+			"update_user": loginUserName,
 		})
 		msgLogId = strconv.FormatInt(msgId, 10)
 		//如果是定时发送
@@ -662,7 +681,7 @@ func SendMsg(param *Message, sendStatus int, loginUserName string, loginUserId i
 			if err != nil {
 				log.Println("迭代数据出错", err)
 			}
-			//log.Println("单条数据:", user.UserId)
+
 			userId := user.UserId
 			if config.SysConfigs.UserIdMap[userId] != "" {
 				userId = config.SysConfigs.UserIdMap[userId]
@@ -673,6 +692,7 @@ func SendMsg(param *Message, sendStatus int, loginUserName string, loginUserId i
 			} else {
 				projectIdMap.Store(userId, true)
 			}
+			log.Println("单条数据用户id:", user.UserId)
 			i++
 			userIds += userId + ","
 
@@ -717,9 +737,12 @@ func SendMsg(param *Message, sendStatus int, loginUserName string, loginUserId i
 			if appVersion > "3.0.3" {
 				go util.AppGrpcPush(dt, otherPushId, jgPushId, phoneType, appPushUrl)
 			}
+			log.Println("用户数量:", i)
 			if i == 100 {
+				log.Println("100用户开始发送消息:", len(userIds))
 				//调用消息中台
 				util.MultipleSaveMessage(msg, userIds, userNames)
+				log.Println("100个用户发送消息完成......")
 				userNames = ""
 				userIds = ""
 				i = 0
@@ -727,8 +750,10 @@ func SendMsg(param *Message, sendStatus int, loginUserName string, loginUserId i
 
 		}
 		if i > 0 {
+			log.Println("最后一批用户开始发送消息:", len(userIds))
 			//调用中台接口
 			util.MultipleSaveMessage(msg, userIds, userNames)
+			log.Println("最后一批用户发送消息:完成")
 			userNames = ""
 			userIds = ""
 			i = 0
@@ -795,3 +820,134 @@ func test_getGroup(ids string) (int, error) {
 	log.Println("获取分组及分组下用户耗时:", tc)
 	return 0, nil
 }
+
+//呼叫中心发送消息
+func pushMsg(param *SendMessage, sendStatus int) (int, error) {
+	var msgLogId string
+	if param.SendMode == 2 {
+		param.SendTime = time.Now().Format(qutil.Date_Full_Layout)
+	}
+	//保存发送的消息
+	log.Println("发送消息发送时间:", param.SendTime)
+	msgId := util.JysqlDB.Insert("message_send_log", map[string]interface{}{
+		"send_usergroup_id":   "",
+		"send_usergroup_name": "",
+		"msg_type":            param.MsgType,
+		"title":               param.Title,
+		"content":             param.Content,
+		"send_mode":           param.SendMode,
+		"send_time":           param.SendTime,
+		"send_status":         sendStatus,
+		"update_time":         time.Now().Format(qutil.Date_Full_Layout),
+		"createtime":          time.Now().Format(qutil.Date_Full_Layout),
+		"link":                param.Link,
+		"isdel":               1,
+		"send_userid":         "hjzx", //呼叫中心
+		"sign":                3,
+	})
+	msgLogId = strconv.FormatInt(msgId, 10)
+	//立即发送
+	if param.SendMode == 2 {
+		//j := 0
+		projectIdMap := sync.Map{}
+		orm := util.Tidb.NewSession()
+		err := orm.Begin()
+		if err != nil {
+			log.Println("简历数据库连接出错:", err)
+		}
+		userNames := ""
+		userIds := ""
+		i := 0
+		msgType := strconv.Itoa(param.MsgType)
+		msg := map[string]interface{}{
+			"sendUserId": "hjzx",
+			"sendName":   "呼叫中心",
+			"title":      param.Title,
+			"content":    param.Content,
+			"msgType":    msgType,
+			"link":       param.Link,
+			"appid":      util.AppId,
+			"msgLogId":   msgLogId,
+		}
+		userIdsArr := strings.Split(param.UserIds, ",")
+		for _, v := range userIdsArr {
+
+			userId := v
+
+			if config.SysConfigs.UserIdMap[userId] != "" {
+				userId = config.SysConfigs.UserIdMap[userId]
+			}
+			if _, ok := projectIdMap.Load(userId); ok {
+				log.Println("########################已发送,本次跳过。。。。。。。。。。。。。", userId)
+				continue
+			} else {
+				projectIdMap.Store(userId, true)
+			}
+			i++
+			userIds += userId + ","
+
+			//查询mongo库用户信息
+			userData := &map[string]interface{}{}
+			ok := false
+			var otherPushId, jgPushId, phoneType, name = "", "", "", ""
+			appVersion := ""
+			userData, ok = util.MQFW.FindById("user", userId, `"s_name":1,"s_opushid":1,"s_jpushid":1,"s_appponetype":1,"s_appversion":1`)
+			if userData != nil && len(*userData) > 0 && ok {
+				otherPushId = qutil.ObjToString((*userData)["s_opushid"])
+				jgPushId = qutil.ObjToString((*userData)["s_jpushid"])
+				phoneType = qutil.ObjToString((*userData)["s_appponetype"])
+				name = qutil.ObjToString((*userData)["s_name"])
+				appVersion = qutil.ObjToString((*userData)["s_appversion"])
+			}
+			userNames += name + ","
+			appPushUrl := "/jyapp/frontPage/messageCenter/sess/index"
+			if strings.Contains(phoneType, "iPhone") {
+				if param.IosUrl != "" {
+					appPushUrl = param.IosUrl
+				}
+			} else {
+				if param.AndroidUrl != "" {
+					appPushUrl = param.AndroidUrl
+				}
+			}
+			//实时发送发送时间为当前时间
+			param.SendTime = time.Now().Format(qutil.Date_Full_Layout)
+			dt := map[string]interface{}{
+				"receiveUserId": userId,
+				"receiveName":   name,
+				"sendUserId":    "qmx",
+				"sendName":      "剑鱼后台",
+				"title":         param.Title,
+				"content":       param.Content,
+				"msgType":       msgType,
+				"link":          param.Link,
+				"appid":         util.AppId,
+			}
+			//推送消息
+			if appVersion > "3.0.3" {
+				go util.AppGrpcPush(dt, otherPushId, jgPushId, phoneType, appPushUrl)
+			}
+			if i == 100 {
+				//调用消息中台
+				log.Println("100个用户开始发送消息:", i)
+				util.MultipleSaveMessage(msg, userIds, userNames)
+				log.Println("100个用户发送消息完成")
+				userNames = ""
+				userIds = ""
+				i = 0
+			}
+
+		}
+		if i > 0 {
+			//调用中台接口
+			log.Println("最后一批用户开始发送消息:", i)
+			util.MultipleSaveMessage(msg, userIds, userNames)
+			log.Println("最后一批用户发送消息完成")
+			userNames = ""
+			userIds = ""
+			i = 0
+		}
+		return 1, nil
+	}
+	return 0, errors.New("发送消息出错")
+}

+ 3 - 0
src/customerService/router.go

@@ -3,6 +3,7 @@ package customerService
 import (
 	"errors"
 	"fmt"
+
 	. "github.com/baiy/Cadmin-server-go/admin"
 )
 
@@ -78,6 +79,8 @@ func init() {
 		"Baiy.Cadmin.Message.importUser":             ImportUser,
 		"Baiy.Cadmin.Message.myCustomerList":         MyCustomerList,
 		"Baiy.Cadmin.Message.getUserInfo":            GetUserInfo,
+		"Baiy.Cadmin.Message.sendMessageApi":         SendMessageApi,
+		"Baiy.Cadmin.Message.getUserIds":             GetUserIds,
 	})
 	RegisterDispatch(SalesDispatcher)
 }

+ 13 - 9
src/github.com/baiy/Cadmin-server-go/system/index/index.go

@@ -246,13 +246,17 @@ func Code(context *admin.Context) (interface{}, error) {
 
 //根据模板发送短信,模板是运营商设定的。
 //第三个参数是可变参数,可以传入多个,但要和模板相匹配
-func SendSMS(tplcode /*模板代码*/, mobile /*手机号码*/ string, param map[string]string) {
-	tmp := []string{}
-	for k, v := range param {
-		tmp = append(tmp, "#"+k+"#="+v)
-	}
-	text := strings.Join(tmp, "&")
-	sms.SendSms(mobile, tplcode, text)
+//func SendSMS(tplcode /*模板代码*/, mobile /*手机号码*/ string, param map[string]string) {
+//	tmp := []string{}
+//	for k, v := range param {
+//		tmp = append(tmp, "#"+k+"#="+v)
+//	}
+//	text := strings.Join(tmp, "&")
+//	sms.SendSms(mobile, tplcode, text)
+//}
+
+func SendSMS(address, mobile string, params ...string) {
+	sms.SendSms(address, "01", mobile, params...)
 }
 
 //发送验证码
@@ -279,8 +283,8 @@ func SendPhoneIdentCode(context *admin.Context, phone string) bool {
 		log.Println("session1保存错误,验证码")
 	}
 	//发送短信
-	param := map[string]string{"code": s_ranNum}
+	//param := map[string]string{"code": s_ranNum}
 	log.Println("短信验证码", phone, s_ranNum)
-	SendSMS("2828060", phone, param)
+	SendSMS(SysConfigs.SmsServiceRpc, phone, s_ranNum)
 	return true
 }

+ 3 - 2
src/github.com/baiy/Cadmin-server-go/system/user/user.go

@@ -1,6 +1,7 @@
 package user
 
 import (
+	. "config"
 	"errors"
 	"github.com/gorilla/sessions"
 	"log"
@@ -147,9 +148,9 @@ func SendPhoneIdentCode(context *admin.Context, phone string) bool {
 		log.Println("session1保存错误,验证码")
 	}
 	//发送短信
-	param := map[string]string{"code": s_ranNum}
+	//param := map[string]string{"code": s_ranNum}
 	log.Println("短信验证码", phone, s_ranNum)
-	index_.SendSMS("2828060", phone, param)
+	index_.SendSMS(SysConfigs.SmsServiceRpc, phone, s_ranNum)
 	return true
 }
 

+ 7 - 1
src/task/task2.go

@@ -401,7 +401,7 @@ func TaskSaveMsg(msgId int, msg *map[string]interface{}, androidUrl, iosUrl stri
 		}
 		//log.Println("单条数据:", user.UserId)
 		userId := user.UserId
-		i++
+
 		if config.SysConfigs.UserIdMap[userId] != "" {
 			userId = config.SysConfigs.UserIdMap[userId]
 		}
@@ -414,6 +414,7 @@ func TaskSaveMsg(msgId int, msg *map[string]interface{}, androidUrl, iosUrl stri
 		} else {
 			projectIdMap.Store(userId, true)
 		}
+		i++
 		userIds += userId + ","
 		//查询mongo库用户信息
 		userData := &map[string]interface{}{}
@@ -456,19 +457,24 @@ func TaskSaveMsg(msgId int, msg *map[string]interface{}, androidUrl, iosUrl stri
 		if appVersion > "3.0.3" {
 			go util.AppGrpcPush(dt, otherPushId, jgPushId, phoneType, appPushUrl)
 		}
+		log.Println("用户数量:", i)
 		if i == 100 {
 			//调用中台接口
+			log.Println("定时发送中100个用户开始发送消息")
 			util.MultipleSaveMessage(msg1, userIds, userNames)
 			userNames = ""
 			userIds = ""
 			i = 0
+			log.Println("定时发送中100个用户发送消息完成")
 		}
 	}
 	if i > 0 {
 		//调用中台接口
+		log.Println("定时发送中最后一批用户开始发送消息")
 		util.MultipleSaveMessage(msg1, userIds, userNames)
 		userNames = ""
 		userIds = ""
+		log.Println("定时发送中最后一批用户发送消息完成")
 	}
 	log.Println("定时任务,获取分组及分组下用户耗时:", time.Since(st))
 	sendStatus := 4

+ 3 - 4
src/templateManage/jyTemplateManageController.go

@@ -5,7 +5,6 @@ import (
 	"fmt"
 	"github.com/baiy/Cadmin-server-go/admin"
 	"math/rand"
-	qutil "qfw/util"
 	"time"
 	"util"
 )
@@ -110,8 +109,8 @@ func Add(context *admin.Context) (interface{}, error) {
 		"template_id":   fmt.Sprint(now.Unix()) + fmt.Sprint(rand.Intn(100)),
 		"create_people": context.User.Username,
 		"last_people":   context.User.Username,
-		"create_time":   now.Format(qutil.Date_Full_Layout),
-		"last_time":     now.Format(qutil.Date_Full_Layout),
+		"create_time":   now,
+		"last_time":     now,
 		"state":         "1",
 	})
 	if id <= 0 {
@@ -130,7 +129,7 @@ func Delete(context *admin.Context) (interface{}, error) {
 		return nil, err
 	}
 	if param.Id != 0 {
-		ok := util.JysqlDB.Update(TemplateManage, map[string]interface{}{"id": param.Id}, map[string]interface{}{"state": 0, "last_time": time.Now().Format(qutil.Date_Full_Layout), "last_people": context.User.Username})
+		ok := util.JysqlDB.Update(TemplateManage, map[string]interface{}{"id": param.Id}, map[string]interface{}{"state": 0, "last_time": time.Now(), "last_people": context.User.Username})
 		if !ok {
 			return nil, errors.New("删除模板信息失败")
 		}

+ 1 - 2
src/templateManage/jyTemplateManageService.go

@@ -1,7 +1,6 @@
 package templateManage
 
 import (
-	qutil "qfw/util"
 	"time"
 	"util"
 )
@@ -18,7 +17,7 @@ func FindOneTemplate(id int) (res map[string]interface{}) {
 }
 
 func UpdateSceneOne(id int, newsContent, newsTitle, newsType, pcLink, templateName, wxLink, androidLink, appleLink, username string) bool {
-	ok := util.JysqlDB.Update(TemplateManage, map[string]interface{}{"id": id}, map[string]interface{}{"news_content": newsContent, "news_title": newsTitle, "news_type": newsType, "pc_link": pcLink, "template_name": templateName, "wx_link": wxLink, "android_link": androidLink, "apple_link": appleLink, "last_time": time.Now().Format(qutil.Date_Full_Layout), "last_people": username})
+	ok := util.JysqlDB.Update(TemplateManage, map[string]interface{}{"id": id}, map[string]interface{}{"news_content": newsContent, "news_title": newsTitle, "news_type": newsType, "pc_link": pcLink, "template_name": templateName, "wx_link": wxLink, "android_link": androidLink, "apple_link": appleLink, "last_time": time.Now(), "last_people": username})
 	if !ok {
 		return false
 	}

+ 2 - 1
src/util/common.go

@@ -145,7 +145,7 @@ func PurchaseUserBalance(params map[string]interface{}) bool {
 }
 
 func MultipleSaveMessage(msg map[string]interface{}, userIds, userNames string) {
-
+	log.Println("开始调用中台接口保存消息")
 	//log.Println("调用批量保存消息接口")
 	//bs, _ := json.Marshal(saveData)
 	//resp, err := CommonPost(qutil.ObjToString(config.SysConfigs.MessageCenter["MultipleSaveMsgUrl"]), url.Values{
@@ -169,6 +169,7 @@ func MultipleSaveMessage(msg map[string]interface{}, userIds, userNames string)
 	}
 	req.Header.Add("Content-Type", "application/json")
 	res, err := client.Do(req)
+	log.Println("调用中台api返回结果")
 	log.Println(res, err)
 	defer res.Body.Close()
 

BIN
src/web/static/importUserErr.xlsx


BIN
src/web/static/importUsers.xlsx