nc-member.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <template>
  2. <view class="container">
  3. <view class="search-wrap" v-if="!info && type == 'member1'">
  4. <view class="header">会员信息</view>
  5. <view class="search-box">
  6. <view class="search-title">询问客户信息查询会员</view>
  7. <view class="search-content">
  8. <input placeholder="请输入会员信息" v-model="searchText" placeholder-style="font-size:0.16rem;color:#ACACAC;" @confirm="searchMember()" />
  9. <button class="primary-btn" @click="searchMember">查询</button>
  10. <button class="default-btn" plain="true" @click="addSwitch">录入</button>
  11. </view>
  12. <view class="search-desc">可查询会员账号、手机号、昵称、会员码(可使用扫码枪)、会员动态码</view>
  13. <view class="search-tips">使用扫码枪时,光标必须在输入框内,方可进行使用</view>
  14. </view>
  15. </view>
  16. <view class="info-wrap" v-if="info && type == 'member1'">
  17. <view class="header">会员信息</view>
  18. <view class="headimg-content">
  19. <view class="headimg"><image :src="info.headimg ? $util.img(info.headimg) : $util.img(defaultImg.head)" @error="info.headimg = defaultImg.head"></image></view>
  20. <view class="header-info">
  21. <view class="name">
  22. {{ info.nickname }}
  23. <text v-if="info.member_level">{{ info.member_level_name }}</text>
  24. </view>
  25. <view class="header-info-item">
  26. <view>电话:{{ info.mobile }}</view>
  27. <view>性别:{{ info.sex == 0 ? '未知' : info.sex == 1 ? '男' : '女' }}</view>
  28. <view>生日:{{ info.birthday ? $util.timeFormat(info.birthday, 'y-m-d') : '--' }}</view>
  29. <view>注册时间:{{ info.reg_time | timeFormat }}</view>
  30. </view>
  31. </view>
  32. </view>
  33. <view class="content-data">
  34. <view class="content-data-item">
  35. <view class="item-title">余额</view>
  36. <view class="item-value">{{ (parseFloat(info.balance_money) + parseFloat(info.balance)) | moneyFormat }}</view>
  37. <view class="item-btn" @click="recharge()">充值</view>
  38. </view>
  39. <view class="content-data-item">
  40. <view class="item-title">积分</view>
  41. <view class="item-value">{{ parseInt(info.point) }}</view>
  42. <view class="item-btn"></view>
  43. </view>
  44. <view class="content-data-item">
  45. <view class="item-title">优惠券(张)</view>
  46. <view class="item-value">{{ info.coupon_num }}</view>
  47. <view class="item-btn" @click="coupon()">查看</view>
  48. </view>
  49. </view>
  50. <view class="member-card-wrap">
  51. <view class="common-tab-wrap" id="tab">
  52. <view class="tab-item active-bar"><text class="text">会员卡项</text></view>
  53. <view class="active" :style="activeStyle"></view>
  54. </view>
  55. <view class="card-wrap">
  56. <scroll-view scroll-y="true" class="card-list" @scrolltolower="getMemberCard()">
  57. <block v-if="memberCardData.list.length">
  58. <view
  59. class="card-item"
  60. :class="{ active: memberCardData.index == index }"
  61. v-for="(item, index) in memberCardData.list"
  62. :key="index"
  63. @click="selectMemberCard(item, index)"
  64. >
  65. <view class="card-name">{{ item.goods_name }}</view>
  66. <view class="info">
  67. <view v-if="item.total_num > 0">可用{{ item.total_num - item.total_use_num }}次</view>
  68. <view v-else>不限次</view>
  69. <view v-if="item.end_time > 0">有效期:{{ $util.timeFormat(item.end_time, 'y-m-d') }}</view>
  70. <view v-else>长期有效</view>
  71. </view>
  72. </view>
  73. </block>
  74. <view v-else class="empty">
  75. <image :src="$util.img('public/uniapp/cashier/card_empty.png')" mode="widthFix"></image>
  76. <view class="tips">暂无可用卡项</view>
  77. </view>
  78. </scroll-view>
  79. <view class="item-list">
  80. <view class="title">
  81. <view>可用服务/商品</view>
  82. <view v-if="memberCardData.currData.card_type == 'commoncard'">
  83. 以下服务/商品剩余可用
  84. <text class="num">{{ memberCardData.currData.total_num - memberCardData.currData.total_use_num }}</text>
  85. </view>
  86. </view>
  87. <scroll-view scroll-y="true" class="item-wrap">
  88. <view class="uni-flex" v-if="memberCardData.currData.item_list">
  89. <view
  90. class="card-item"
  91. :class="{
  92. active: memberCardData.selected['item_' + item.item_id],
  93. 'item-mum-1': itemNum == 1,
  94. 'item-mum-2': itemNum == 2,
  95. 'item-mum-3': itemNum == 3,
  96. 'not-select': !checkStatus(item) && !memberCardData.selected['item_' + item.item_id]
  97. }"
  98. @click="selectMemberCardItem(item, index)"
  99. v-for="(item, index) in memberCardData.currData.item_list"
  100. >
  101. <view class="image"><image :src="$util.img(item.sku_image, { size: 'small' })" mode="widthFix"></image></view>
  102. <view class="info">
  103. <view>
  104. <view class="name">
  105. <text class="tag">{{ item.is_virtual ? '服务' : '商品' }}</text>
  106. {{ item.sku_name }}
  107. </view>
  108. <block v-if="memberCardData.currData.card_type != 'commoncard'">
  109. <view class="num" v-if="item.num > 0">剩余可用{{ item.num - item.use_num }}次</view>
  110. <view class="num" v-else>不限次</view>
  111. </block>
  112. </view>
  113. <view class="operation-wrap">
  114. <view class="price">
  115. <text class="util">¥</text>
  116. {{ item.price }}
  117. </view>
  118. <view class="number-wrap" v-if="memberCardData.selected['item_' + item.item_id]">
  119. <text class="iconfont iconjian" @click.stop="itemDec(memberCardData.selected['item_' + item.item_id])"></text>
  120. <input type="number" v-model="memberCardData.selected['item_' + item.item_id].input_num" />
  121. <text class="iconfont iconjia" @click.stop="itemInc(memberCardData.selected['item_' + item.item_id])"></text>
  122. </view>
  123. </view>
  124. </view>
  125. </view>
  126. </view>
  127. <view class="empty" v-else>
  128. <image :src="$util.img('public/uniapp/cashier/goods_empty.png')" mode="widthFix"></image>
  129. <view class="tips">暂无相关数据</view>
  130. </view>
  131. </scroll-view>
  132. <view class="button-wrap">
  133. <button type="default" class="primary-btn" :disabled="memberCardData.itemIndex == -1" @click="selectGoods()">加入购物车</button>
  134. </view>
  135. </view>
  136. </view>
  137. </view>
  138. </view>
  139. <view class="info-wrap" v-if="info && type == 'card'">
  140. <view class="header">会员卡项</view>
  141. <view class="headimg-content">
  142. <view class="headimg"><image :src="info.headimg ? $util.img(info.headimg) : $util.img(defaultImg.head)" @error="info.headimg = defaultImg.head"></image></view>
  143. <view class="header-info">
  144. <view class="name">
  145. {{ info.nickname }}
  146. <text v-if="info.member_level">{{ info.member_level_name }}</text>
  147. </view>
  148. <view class="header-info-item">
  149. <view>电话:{{ info.mobile }}</view>
  150. <view>性别:{{ info.sex == 0 ? '未知' : info.sex == 1 ? '男' : '女' }}</view>
  151. <view>生日:{{ info.birthday && memberInfo.birthday ? memberInfo.birthday : '--' }}</view>
  152. <view>注册时间:{{ info.reg_time | timeFormat }}</view>
  153. </view>
  154. </view>
  155. </view>
  156. <view class="member-card-wrap">
  157. <view class="common-tab-wrap" id="tab">
  158. <view class="tab-item active-bar"><text class="text">会员卡项</text></view>
  159. <view class="active" :style="activeStyle"></view>
  160. </view>
  161. <view class="card-wrap">
  162. <scroll-view scroll-y="true" class="card-list" @scrolltolower="getMemberCard()">
  163. <block v-if="memberCardData.list.length">
  164. <view
  165. class="card-item"
  166. :class="{ active: memberCardData.index == index }"
  167. v-for="(item, index) in memberCardData.list"
  168. :key="index"
  169. @click="selectMemberCard(item, index)"
  170. >
  171. <view class="card-name">{{ item.goods_name }}</view>
  172. <view class="info">
  173. <view v-if="item.total_num > 0">可用{{ item.total_num - item.total_use_num }}次</view>
  174. <view v-else>不限次</view>
  175. <view v-if="item.end_time > 0">有效期:{{ $util.timeFormat(item.end_time, 'y-m-d') }}</view>
  176. <view v-else>长期有效</view>
  177. </view>
  178. </view>
  179. </block>
  180. <view v-else class="empty">
  181. <image :src="$util.img('public/uniapp/cashier/card_empty.png')" mode="widthFix"></image>
  182. <view class="tips">暂无可用卡项</view>
  183. </view>
  184. </scroll-view>
  185. <view class="item-list">
  186. <view class="title">
  187. <view>可用服务/商品</view>
  188. <view v-if="memberCardData.currData.card_type == 'commoncard'">
  189. 以下服务/商品剩余可用
  190. <text class="num">{{ memberCardData.currData.total_num - memberCardData.currData.total_use_num }}</text>
  191. </view>
  192. </view>
  193. <scroll-view scroll-y="true" class="item-wrap">
  194. <view class="uni-flex" v-if="memberCardData.currData.item_list">
  195. <view
  196. class="card-item"
  197. :class="{
  198. active: memberCardData.selected['item_' + item.item_id],
  199. 'item-mum-1': itemNum == 1,
  200. 'item-mum-2': itemNum == 2,
  201. 'item-mum-3': itemNum == 3,
  202. 'not-select': !checkStatus(item) && !memberCardData.selected['item_' + item.item_id]
  203. }"
  204. @click="selectMemberCardItem(item, index)"
  205. v-for="(item, index) in memberCardData.currData.item_list"
  206. >
  207. <view class="image"><image :src="$util.img(item.sku_image, { size: 'small' })" mode="widthFix"></image></view>
  208. <view class="info">
  209. <view>
  210. <view class="name">
  211. <text class="tag">{{ item.is_virtual ? '服务' : '商品' }}</text>
  212. {{ item.sku_name }}
  213. </view>
  214. <block v-if="memberCardData.currData.card_type != 'commoncard'">
  215. <view class="num" v-if="item.num > 0">剩余可用{{ item.num - item.use_num }}次</view>
  216. <view class="num" v-else>不限次</view>
  217. </block>
  218. </view>
  219. <view class="operation-wrap">
  220. <view class="price">
  221. <text class="util">¥</text>
  222. {{ item.price }}
  223. </view>
  224. <view class="number-wrap" v-if="memberCardData.selected['item_' + item.item_id]">
  225. <text class="iconfont iconjian" @click.stop="itemDec(memberCardData.selected['item_' + item.item_id])"></text>
  226. <input type="number" v-model="memberCardData.selected['item_' + item.item_id].input_num" />
  227. <text class="iconfont iconjia" @click.stop="itemInc(memberCardData.selected['item_' + item.item_id])"></text>
  228. </view>
  229. </view>
  230. </view>
  231. </view>
  232. </view>
  233. <view class="empty" v-else>
  234. <image :src="$util.img('public/uniapp/cashier/goods_empty.png')" mode="widthFix"></image>
  235. <view class="tips">暂无相关数据</view>
  236. </view>
  237. </scroll-view>
  238. <view class="button-wrap">
  239. <button type="default" class="primary-btn" :disabled="memberCardData.itemIndex == -1" @click="selectGoods()">加入购物车</button>
  240. </view>
  241. </view>
  242. </view>
  243. </view>
  244. </view>
  245. <view class="coupon-box" v-if="info && type == 'coupon'">
  246. <i class="iconguanbi1 iconfont " @click="type = 'member'"></i>
  247. <view class="content-list">
  248. <view class="content-item" v-for="(item, index) in memberCoupon" v-if="memberCoupon.length > 0">
  249. <view class="item-title">{{ item.coupon_name }}</view>
  250. <view class="item-content" v-if="item.type == 'reward' || item.type == 'random'">
  251. <text>¥</text>
  252. {{ item.money }}
  253. </view>
  254. <view class="item-content" v-if="item.type == 'discount'">
  255. {{ item.discount }}
  256. <text>折</text>
  257. </view>
  258. <view class="item-line"></view>
  259. <view class="item-bottom">
  260. <view class="item-desc" v-if="item.type == 'reward' || item.type == 'random'">满{{ item.at_least }}可用</view>
  261. <view class="item-desc" v-if="item.type == 'discount'">满{{ item.at_least }}可用,最多优惠{{ item.discount_limit }}元</view>
  262. <view class="item-time">{{ $util.timeFormat(item.start_time) }}至{{ $util.timeFormat(item.end_time) }}</view>
  263. </view>
  264. </view>
  265. <view class="empty" v-if="memberCoupon.length == 0">
  266. <image :src="$util.img('public/uniapp/cashier/goods_empty.png')" mode="widthFix"></image>
  267. <view class="tips">暂无优惠券</view>
  268. </view>
  269. </view>
  270. </view>
  271. <view class="coupon-box" v-if="info && type == 'hongbao'">
  272. <text class="iconguanbi1 iconfont " @click="type = 'member'"></text>
  273. <view class="content-list">
  274. <view class="content-item" v-for="(item, index) in memberHongbao" v-if="memberHongbao.length > 0">
  275. <view class="item-title">{{ item.name }}</view>
  276. <view class="item-content">
  277. <text>¥</text>
  278. {{ item.money }}
  279. </view>
  280. <view class="item-line"></view>
  281. <view class="item-bottom">
  282. <view class="item-time">{{ $util.timeFormat(item.start_time) }}至{{ $util.timeFormat(item.end_time) }}</view>
  283. </view>
  284. </view>
  285. <view class="empty" v-if="memberHongbao.length == 0">
  286. <image :src="$util.img('public/uniapp/cashier/goods_empty.png')" mode="widthFix"></image>
  287. <view class="tips">暂无红包</view>
  288. </view>
  289. </view>
  290. </view>
  291. <!-- 录入会员 -->
  292. <view class="form-box" v-if="!info && type == 'addmember'">
  293. <view class="header">录入会员</view>
  294. <view class="form-content">
  295. <view>
  296. <view class="form-item">
  297. <view class="form-label">
  298. <text class="required">*</text>
  299. 手机号:
  300. </view>
  301. <view class="form-inline search-wrap"><input type="number" class="form-input" v-model="memberData.mobile" placeholder="请输入会员手机号" /></view>
  302. </view>
  303. <view class="form-item">
  304. <view class="form-label">
  305. <text class="required"></text>
  306. 会员名称:
  307. </view>
  308. <view class="form-inline search-wrap"><input type="text" class="form-input" v-model="memberData.nickname" placeholder="请输入会员昵称" /></view>
  309. </view>
  310. <view class="form-item">
  311. <view class="form-label">
  312. <text class="required"></text>
  313. 性别:
  314. </view>
  315. <view class="form-inline search-wrap"><uni-data-checkbox v-model="memberData.sex" selectedColor="#8558FA" :localdata="sex"></uni-data-checkbox></view>
  316. </view>
  317. <view class="form-item">
  318. <view class="form-label">
  319. <text class="required"></text>
  320. 生日:
  321. </view>
  322. <view class="form-inline">
  323. <uni-datetime-picker :start="startDate" v-model="memberData.birthday" type="date" :clearIcon="false" @change="changeTime" />
  324. </view>
  325. </view>
  326. <view class="form-item">
  327. <view class="form-label">
  328. <text class="required"></text>
  329. 会员等级:
  330. </view>
  331. <view class="form-inline">
  332. <select-lay
  333. :zindex="10"
  334. :value="memberData.member_level"
  335. name="names"
  336. placeholder="请选择会员等级"
  337. :options="memberLevelList"
  338. @selectitem="selectMemberLevel"
  339. ></select-lay>
  340. </view>
  341. </view>
  342. </view>
  343. <view class="form-item">
  344. <view class="form-label"></view>
  345. <view class="form-inline">
  346. <button type="primary" class="primary-btn" @click="addMember">确定录入</button>
  347. <button type="primary" class="default-btn" @click="type = 'member'">返回搜索</button>
  348. </view>
  349. </view>
  350. </view>
  351. </view>
  352. </view>
  353. </template>
  354. <script>
  355. import uniDataCheckbox from '@/components/uni-data-checkbox/uni-data-checkbox.vue';
  356. import ncMember from './nc-member.js';
  357. export default {
  358. components: {
  359. uniDataCheckbox
  360. },
  361. name: 'ncMember',
  362. props: {},
  363. mixins: [ncMember],
  364. computed: {
  365. info() {
  366. if (this.memberInfo) this.type = 'card';
  367. return this.memberInfo;
  368. }
  369. },
  370. watch: {
  371. info: function(nVal, oVal) {
  372. if ((nVal && !oVal) || (nVal && oVal && nVal.member_id != oVal.member_id) || !nVal) {
  373. this.memberCardData.page = 0;
  374. this.memberCardData.index = 0;
  375. this.memberCardData.list = [];
  376. this.memberCardData.currData = {};
  377. this.memberCardData.selected = {};
  378. if (nVal) this.getMemberCard();
  379. }
  380. }
  381. }
  382. };
  383. </script>
  384. <style lang="scss">
  385. @import './nc-member.scss';
  386. </style>