index.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <?php
  2. /**
  3. * 核销员管理
  4. */
  5. ?>
  6. <div id="app" v-cloak>
  7. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  8. <div slot="header">
  9. <span>核销员管理</span>
  10. </div>
  11. <div class="table-body">
  12. <div style="float: right;display:inline-block ">
  13. <el-button type="primary" size="small" style="padding: 9px 15px !important;" @click="addbtn" icon="el-icon-plus">添加核销员
  14. </el-button>
  15. </div>
  16. <div class="input-item">
  17. <el-input @keyup.enter.native="loadData" size="small" placeholder="请输入会员id" v-model="search.user_id"
  18. clearable @clear="toSearch">
  19. </el-input>
  20. </div>
  21. <div class="input-item">
  22. <el-input @keyup.enter.native="loadData" size="small" placeholder="请输入手机号" v-model="search.keyword"
  23. clearable @clear="toSearch">
  24. </el-input>
  25. </div>
  26. <div class="input-item2">
  27. <el-date-picker el-date-picker v-model="time" type="daterange"
  28. range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
  29. @change="timechange" value-format="yyyy-MM-dd">
  30. </el-date-picker>
  31. </div>
  32. <el-button type="primary" size="small" style="padding: 9px 15px !important;" icon="el-icon-search" @click="toSearch">搜索</el-button>
  33. <el-button size="small" style="padding: 9px 15px !important;" icon="el-icon-refresh-right" @click="reset">重置</el-button>
  34. <el-table :data="list" :default-sort = "{prop: 'time'}">
  35. <el-table-column el-table-column label="会员id" prop="user_id" align="center">
  36. </el-table-column>
  37. <el-table-column label="核销员名称" width="200">
  38. <template slot-scope="scope">
  39. <div class="table-info-img-text">
  40. <el-image class="table-info-img circle" :src="scope.row.avatar_url">
  41. <div slot="error" class="image-slot">
  42. <com-image src="/resources/img/common/default-avatar.png"></com-image>
  43. </div>
  44. </el-image>
  45. <div class="no_user" style="width: 50px; bottom:20px;" v-if="scope.row.status == 0">黑名单</div>
  46. <div class="table-info-text">
  47. <div style="color:#000;">{{scope.row.nickname}}</div>
  48. </div>
  49. </div>
  50. </template>
  51. </el-table-column>
  52. <el-table-column el-table-column label="联系电话" prop="mobile" align="center">
  53. </el-table-column>
  54. <el-table-column el-table-column label="添加时间" prop="created_at" align="center" sortable>
  55. <template slot-scope="scope">
  56. {{timeformat(scope.row.created_at)}}
  57. </template>
  58. </el-table-column>
  59. <el-table-column el-table-column label="操作" align="center" >
  60. <template slot-scope="scope">
  61. <el-button type="danger" size="mini" icon="el-icon-delete" plain @click="delWriteOffCleck(scope.row.id)">删除</el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65. <!-- 分页 -->
  66. <div flex="box:last cross:center">
  67. <div></div>
  68. <div>
  69. <el-pagination v-if="list.length > 0" style="display: inline-block;float: right;"
  70. background :page-size="pageSize" @current-change="pageChange" layout="prev, pager, next"
  71. :current-page="current_page" :total="totalCount">
  72. </el-pagination>
  73. </div>
  74. </div>
  75. </div>
  76. </el-card>
  77. <!-- 添加核销员弹层 -->
  78. <el-dialog
  79. title="新增核销员"
  80. :visible.sync="WriteOffCleckSjow"
  81. width="600px">
  82. <div>
  83. <el-form :model="addform" label-width="100px" ref="numberValidateForm">
  84. <el-form-item label="选择会员:" prop="user_id" :rules="[{required: true, message: '会员不能为空',trigger: 'change'}]">
  85. <el-autocomplete size="small" v-model="add.nickname" value-key="nickname"
  86. :fetch-suggestions="userquerySearchAsync" placeholder="请选择用户" @select="usershareClick">
  87. </el-autocomplete>
  88. </el-form-item>
  89. <el-form-item label="所属门店:" prop="store_id" :rules="[{required: true, message: '所属门店不能为空',trigger: 'change'}]">
  90. <el-autocomplete l-autocomplete size="small" v-model="add.store_name" value-key="store_name"
  91. :fetch-suggestions="storequerySearchAsync" placeholder="请选择门店" @select="storeshareClick">
  92. </el-autocomplete>
  93. </el-form-item>
  94. </el-form>
  95. </div>
  96. <span slot="footer" class="dialog-footer">
  97. <el-button @click="WriteOffCleckSjow = false">取 消</el-button>
  98. <el-button type="primary" @click="addWriteOffCleck('numberValidateForm')">确 定</el-button>
  99. </span>
  100. </el-dialog>
  101. </div>
  102. <script>
  103. const app = new Vue({
  104. el: '#app',
  105. data: {
  106. search: { // 搜索条件
  107. user_id: '',
  108. keyword:'',
  109. start:'',
  110. end:'',
  111. page: this.current_page
  112. },
  113. time:[],
  114. list:[{}], // 表格列表
  115. pageSize:10,
  116. current_page:1,
  117. totalCount:0,
  118. WriteOffCleckSjow:false, // 核销员弹层
  119. add: {
  120. nickname:'',
  121. store_name:'',
  122. },
  123. addform: {
  124. user_id:'',
  125. store_id:'',
  126. },
  127. userList:[],
  128. storeList:[]
  129. },
  130. mounted() {
  131. this.getDataList()
  132. },
  133. methods: {
  134. // 获取数据
  135. getDataList(search = {}) {
  136. request({
  137. params: {
  138. r: 'clerk/default/index',
  139. ...search
  140. },
  141. method: 'get',
  142. }).then(e => {
  143. console.log(e.data.data);
  144. this.list = e.data.data.list
  145. this.page_count = e.data.data.page_count
  146. this.pageSize = e.data.data.page_size
  147. this.totalCount = e.data.data.count
  148. // this.current_page = e.data.data.page;
  149. }).catch(e => {
  150. this.dialogLoading = false;
  151. this.$message.error('未知错误');
  152. });
  153. },
  154. // 添加核销员按钮
  155. addbtn () {
  156. this.WriteOffCleckSjow = true
  157. },
  158. // 获取门店列表
  159. getStore(cb) {
  160. request({
  161. params: {
  162. r: 'clerk/default/search-store',
  163. keyword: this.add.store_name
  164. },
  165. method: 'get',
  166. }).then(e => {
  167. if (e.data.code == 0) {
  168. cb(e.data.data.list)
  169. } else {
  170. this.$message.error(e.data.msg);
  171. }
  172. })
  173. },
  174. // 获取用户列表
  175. getUserlist(cb) {
  176. request({
  177. params: {
  178. r: 'clerk/default/search-user',
  179. keyword: this.add.nickname
  180. },
  181. method: 'get',
  182. }).then(e => {
  183. if (e.data.code == 0) {
  184. cb(e.data.data.list)
  185. } else {
  186. this.$message.error(e.data.msg);
  187. }
  188. })
  189. },
  190. // 添加核销员 下拉
  191. storeshareClick(row) {
  192. this.addform.store_id = row.id
  193. },
  194. usershareClick(row) {
  195. this.addform.user_id = row.id
  196. },
  197. // 输入建议
  198. userquerySearchAsync(queryString, cb) {
  199. this.getUserlist(cb)
  200. },
  201. storequerySearchAsync(queryString, cb) {
  202. this.getStore(cb)
  203. },
  204. // 切换分页
  205. pageChange(v) {
  206. console.log(v);
  207. this.search.page = v
  208. this.getDataList(this.search)
  209. },
  210. // 删除核销员
  211. delWriteOffCleck(id) {
  212. // console.log(id);
  213. let self = this;
  214. self.$confirm('删除该分销商, 是否继续?', '提示', {
  215. confirmButtonText: '确定',
  216. cancelButtonText: '取消',
  217. type: 'warning'
  218. }).then(() => {
  219. self.listLoading = true;
  220. request({
  221. params: {
  222. r: 'clerk/default/del',
  223. },
  224. data: {
  225. id
  226. },
  227. method: 'post',
  228. }).then(e => {
  229. if (e.data.code === 0) {
  230. self.$message.success(e.data.msg);
  231. self.getDataList(this.search)
  232. } else {
  233. self.$message.error(e.data.msg);
  234. }
  235. }).catch(e => {
  236. self.dialogLoading = false;
  237. self.$message.error('未知错误');
  238. });
  239. }).catch(() => {
  240. self.$message.info('已取消删除')
  241. });
  242. },
  243. // 添加核销员
  244. addWriteOffCleck(formName) {
  245. this.$refs[formName].validate((valid) => {
  246. if (valid) {
  247. request({
  248. params: {
  249. // contentType: "application/x-www-form-urlencoded",
  250. // contentType: "x-www-form-urlencoded",
  251. // contentType: "multipart/form-data",
  252. contentType: "form-data",
  253. r: 'clerk/default/edit',
  254. },
  255. data: this.addform,
  256. method: 'post',
  257. }).then(e => {
  258. console.log(e);
  259. this.$message.info(e.data.msg)
  260. this.WriteOffCleckSjow = false
  261. this.getDataList(this.search)
  262. }).catch(() => {
  263. this.$message.info('未知错误')
  264. });
  265. } else {
  266. return false;
  267. }
  268. });
  269. },
  270. loadData() {
  271. this.getDataList(this.search)
  272. },
  273. // 搜索
  274. toSearch() {
  275. this.getDataList(this.search)
  276. },
  277. timechange(v) {
  278. if(v == null) {
  279. v = ['','']
  280. this.time = ['','']
  281. this.search.start = null
  282. this.search.end = null
  283. }else {
  284. this.search.start = v[0] + ' 00:00:00'
  285. this.search.end = v[1] + ' 00:00:00'
  286. }
  287. this.getDataList(this.search)
  288. },
  289. // 重置
  290. reset() {
  291. this.search = {
  292. user_id: '',
  293. keyword:'',
  294. start:'',
  295. end:'',
  296. page:1
  297. },
  298. this.getDataList(this.search)
  299. },
  300. // 时间格式化
  301. timeformat(v) {
  302. let time = new Date(v*1000)
  303. return time.getFullYear() +'/'+(time.getUTCMonth()+1)+'/'+time.getDate() + ' '+ (time.getHours()<10?'0' +time.getHours():time.getHours()) +':'+ (time.getMinutes()<10?'0'+time.getMinutes():time.getMinutes()) + ':'+ (time.getSeconds()<10?'0'+time.getSeconds():time.getSeconds())
  304. }
  305. }
  306. });
  307. </script>
  308. <style>
  309. .table-body{
  310. padding: 20px;
  311. background-color: #fff;
  312. }
  313. .input-item {
  314. width: 250px;
  315. margin: 0 10px 20px;
  316. display: inline-block;
  317. }
  318. .input-item2 {
  319. width: 350px;
  320. margin: 0 10px 20px;
  321. display: inline-block;
  322. }
  323. </style>