SelectLuckBag.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <template>
  2. <view>
  3. <u-popup :show="show" mode="center" bgColor="transparent" @close="close"
  4. :customStyle="{background: 'transparent'}">
  5. <view class="luck-bag-container">
  6. <!-- 顶部福袋图片 -->
  7. <image class="bag-image" src="/pages_im/static/images/luckyBag/lucky_bag_img.png"></image>
  8. <!-- 主体内容区域 -->
  9. <view class="content-box">
  10. <view>
  11. <image class="lucky_bag_font" src="/pages_im/static/images/luckyBag/lucky_bag_font.png" mode="">
  12. </image>
  13. </view>
  14. <!-- 福袋个数 -->
  15. <view class="form-item es-mt-32" @click="selectCount">
  16. <text class="label">福袋</text>
  17. <view class="input-wrap">
  18. <text v-if="count" class="value">{{ count }}</text>
  19. <text v-else class="placeholder">请选择</text>
  20. <u-icon name="arrow-right" color="#999" size="14"></u-icon>
  21. </view>
  22. </view>
  23. <!-- 提交按钮 -->
  24. <view class="submit-btn" @click="submit">
  25. <text class="btn-text">塞进福袋</text>
  26. </view>
  27. </view>
  28. <!-- 关闭按钮 -->
  29. <view class="close-btn" @click="close">
  30. <image class="es-icon-64" src="/pages_im/static/images/luckyBag/close_tc_icon.png" mode=""></image>
  31. </view>
  32. </view>
  33. </u-popup>
  34. <!-- 个数选择器 -->
  35. <u-picker :show="showPicker" keyName="name" :columns="pickerColumns" @confirm="confirmPicker"
  36. @cancel="showPicker = false" @close="showPicker = false"></u-picker>
  37. </view>
  38. </template>
  39. <script>
  40. import {
  41. mapGetters,
  42. mapActions
  43. } from 'vuex';
  44. import {
  45. parseMessageByType
  46. } from '@/pages_im/util/imCommon';
  47. import IMSDK, {
  48. IMMethods,
  49. MessageStatus
  50. } from 'openim-uniapp-polyfill';
  51. import {
  52. luckyBagList,
  53. createFdMiniLink,
  54. receiveLuckyBag
  55. } from '@/pages_im/api/luckyBag.js'
  56. export default {
  57. name: 'SelectLuckBag',
  58. props: {
  59. show: {
  60. type: Boolean,
  61. default: false
  62. }
  63. },
  64. computed: {
  65. ...mapGetters(['storeCurrentConversation'])
  66. },
  67. data() {
  68. return {
  69. count: '',
  70. showPicker: false,
  71. list: [],
  72. pickerColumns: []
  73. }
  74. },
  75. methods: {
  76. ...mapActions('message', ['pushNewMessage', 'updateOneMessage']),
  77. close() {
  78. this.$emit('close');
  79. },
  80. async selectCount() {
  81. let companyUserInfo = uni.getStorageSync('companyUserInfo')
  82. const companyId = companyUserInfo && JSON.parse(companyUserInfo).companyId
  83. const res = await luckyBagList({
  84. companyId
  85. })
  86. if (res.code == 200) {
  87. this.list = res.rows
  88. this.pickerColumns = [res.rows.map(item => item.name)]
  89. this.showPicker = true;
  90. } else {
  91. uni.showToast({
  92. icon: 'non',
  93. title: res.msg
  94. })
  95. }
  96. },
  97. confirmPicker(e) {
  98. this.count = e.value[0];
  99. this.luckyBagId = this.list[e.indexs[0]].id;
  100. this.showPicker = false;
  101. },
  102. async submit() {
  103. if (!this.count) {
  104. return uni.showToast({
  105. title: '请选择福袋',
  106. icon: 'none'
  107. });
  108. }
  109. let companyUserInfo = uni.getStorageSync('companyUserInfo')
  110. companyUserInfo = companyUserInfo && JSON.parse(companyUserInfo)
  111. let params = {
  112. companyId: companyUserInfo.companyId,
  113. luckyBagId: this.luckyBagId,
  114. companyUserId: companyUserInfo.userId
  115. }
  116. let that = this
  117. const res = await createFdMiniLink(params)
  118. if (res.code == 200) {
  119. if (!res.data.recordId) return
  120. let payloadJson = {
  121. payload: {
  122. data: "luckyBag",
  123. extension: {
  124. isReceived: false,
  125. nickName: companyUserInfo.nickName,
  126. userName: companyUserInfo.userName,
  127. companyId: companyUserInfo.companyId,
  128. avatar: companyUserInfo.avatar,
  129. recordId: res.data.recordId || '',
  130. }
  131. }
  132. };
  133. let forwardMessage = {
  134. data: JSON.stringify(payloadJson),
  135. extension: '',
  136. description: 'luckyBag'
  137. };
  138. let message = await IMSDK.asyncApi(IMMethods.CreateCustomMessage, IMSDK.uuid(), forwardMessage);
  139. that.pushNewMessage(message);
  140. let offlinePushInfo = {
  141. title: message.senderNickname,
  142. desc: parseMessageByType(message),
  143. ex: "",
  144. iOSPushSound: "",
  145. iOSBadgeCount: true
  146. };
  147. IMSDK.asyncApi(IMMethods.SendMessage, IMSDK.uuid(), {
  148. recvID: that.storeCurrentConversation.userID,
  149. groupID: that.storeCurrentConversation.groupID,
  150. message,
  151. offlinePushInfo
  152. }).then(({
  153. data
  154. }) => {
  155. that.close();
  156. that.updateOneMessage({
  157. message: data,
  158. isSuccess: true
  159. });
  160. }).catch(({
  161. data,
  162. errCode,
  163. errMsg
  164. }) => {
  165. that.updateOneMessage({
  166. message: data,
  167. type: UpdateMessageTypes.KeyWords,
  168. keyWords: [{
  169. key: 'status',
  170. value: MessageStatus.Failed
  171. },
  172. {
  173. key: 'errCode',
  174. value: errCode
  175. }
  176. ]
  177. });
  178. });
  179. } else {
  180. uni.showToast({
  181. icon: 'non',
  182. title: res.msg
  183. })
  184. }
  185. }
  186. }
  187. }
  188. </script>
  189. <style lang="scss" scoped>
  190. .luck-bag-container {
  191. width: 600rpx;
  192. display: flex;
  193. flex-direction: column;
  194. align-items: center;
  195. position: relative;
  196. .bag-image {
  197. width: 100%;
  198. height: 308rpx;
  199. z-index: 10;
  200. margin-bottom: -50rpx; // 让图片下沉覆盖到红框上
  201. }
  202. .content-box {
  203. width: 100%;
  204. background: linear-gradient(180deg, #FD303D 0%, #FEB6A7 99.99%);
  205. border-radius: 30rpx;
  206. padding: 90rpx 40rpx 50rpx 40rpx;
  207. box-sizing: border-box;
  208. display: flex;
  209. flex-direction: column;
  210. align-items: center;
  211. box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.2);
  212. .lucky_bag_font {
  213. width: 240rpx;
  214. height: 80rpx;
  215. }
  216. .form-item {
  217. width: 100%;
  218. height: 100rpx;
  219. background: #fff;
  220. border-radius: 16rpx;
  221. display: flex;
  222. align-items: center;
  223. justify-content: space-between;
  224. padding: 0 30rpx;
  225. box-sizing: border-box;
  226. margin-bottom: 16rpx;
  227. .label {
  228. font-size: 32rpx;
  229. color: #333;
  230. font-weight: 600;
  231. }
  232. .input-wrap {
  233. display: flex;
  234. align-items: center;
  235. flex: 1;
  236. justify-content: flex-end;
  237. .value {
  238. font-size: 32rpx;
  239. color: #333;
  240. margin-right: 10rpx;
  241. }
  242. .placeholder {
  243. font-size: 30rpx;
  244. color: #999;
  245. margin-right: 10rpx;
  246. }
  247. .input {
  248. text-align: right;
  249. font-size: 32rpx;
  250. color: #333;
  251. width: 100%;
  252. height: 100%;
  253. }
  254. }
  255. }
  256. .submit-btn {
  257. width: 100%;
  258. height: 108rpx;
  259. background-image: url('@/pages_im/static/images/luckyBag/lucky_bag_btn.png');
  260. background-repeat: no-repeat;
  261. background-size: 100% 100%;
  262. border-radius: 50rpx;
  263. display: flex;
  264. align-items: center;
  265. justify-content: center;
  266. margin-top: 32rpx;
  267. .btn-text {
  268. margin-bottom: 20rpx;
  269. font-size: 40rpx;
  270. color: #fff;
  271. font-weight: bold;
  272. text-shadow: 0 2rpx 4rpx rgba(186, 76, 0, 0.3);
  273. }
  274. }
  275. }
  276. .close-btn {
  277. margin-top: 50rpx;
  278. width: 70rpx;
  279. height: 70rpx;
  280. border-radius: 50%;
  281. display: flex;
  282. align-items: center;
  283. justify-content: center;
  284. }
  285. }
  286. </style>