yusm 2 veckor sedan
förälder
incheckning
e27b18fd82

+ 12 - 0
fhKeeper/formulahousekeeper/management-workshop/pom.xml

@@ -231,6 +231,18 @@
             <artifactId>commons-compress</artifactId>
             <version>1.18</version>
         </dependency>
+
+        <!-- ZXing 二维码生成库 -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.4.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 14 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/FactoryController.java

@@ -1,6 +1,9 @@
 package com.management.platform.controller;
 
 
+import com.management.platform.service.FactoryService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -16,6 +19,17 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/factory")
 public class FactoryController {
+    @Autowired
+    private FactoryService factoryService;
+    @RequestMapping("/getFactories")
+    public HttpRespMsg getFactories(){
+        HttpRespMsg msg = new HttpRespMsg();
+
+       msg.setData(factoryService.list());
+       msg.setCode("ok");
+       return msg;
+    }
+
 
 }
 

+ 144 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MealApplicationsController.java

@@ -1,10 +1,33 @@
 package com.management.platform.controller;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.management.platform.entity.MealApplications;
+import com.management.platform.entity.User;
+import com.management.platform.service.MealApplicationsService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+
 /**
  * <p>
  *  前端控制器
@@ -16,6 +39,127 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/meal-applications")
 public class MealApplicationsController {
+    @Autowired
+    private MealApplicationsService mealApplicationsService;
+    @RequestMapping("/apply")
+    public HttpRespMsg apply(HttpServletRequest request,String mealType, String factory){
+        HttpRespMsg msg = new HttpRespMsg();
+        String userId= request.getHeader("token");
+        if(userId==null){
+            return msg.fail("请先登录");
+        }
+        QueryWrapper<MealApplications> eq = new QueryWrapper<MealApplications>().eq("user_id", userId).eq("meal_type_id", mealType).eq("factory_id", factory).eq("application_date", LocalDate.now());
+        List<MealApplications> list = mealApplicationsService.list(eq);
+        Optional<MealApplications> first = list.stream().filter(mealApplications -> mealApplications.getStatus().equals("0")).findFirst();
+        if (first.isPresent()){
+            return msg.fail("已申报过");
+        }
+//        HttpRespMsg qrCode = this.getQrCode(request, mealType, factory);
+//        if (qrCode.getCode().equals("ok")){
+//            return  msg.fail("已申报过");
+//        }
+        try {
+            // 生成二维码内容
+//            String qrContent = "mealId:" + mealType + ",factoryId:" + factory + ",userId:" + userId;
+//            // 生成二维码图片
+//            String qrCodeBase64 = generateQRCode(qrContent, 300, 300);
+            MealApplications mealApplications = new MealApplications();
+            mealApplications.setUserId(userId);
+            mealApplications.setMealTypeId(mealType);
+            mealApplications.setFactoryId(Integer.valueOf(factory));
+//            mealApplications.setQrCode(qrCodeBase64);
+            LocalDateTime now = LocalDateTime.now();
+
+            mealApplications.setApplicationDate(now.toLocalDate());
+            mealApplications.setAppliedAt(now);
+            mealApplications.setStatus(0);
+            boolean save = mealApplicationsService.save(mealApplications);
+            if (save) {
+                Integer generatedId = mealApplications.getId();
+
+                // 生成二维码内容
+                String qrContent = now + "" + generatedId;
+                // 生成二维码图片
+                String qrCodeBase64 = generateQRCode(qrContent, 300, 300);
+                mealApplications.setQrCode(qrCodeBase64);
+                mealApplications.setCode(qrContent);
+                boolean update = mealApplicationsService.updateById(mealApplications);
+
+            if (update) {
+                msg.setData(mealApplications);
+                return msg;
+            } else {
+                return msg.fail("报餐失败");
+            }
+        }else {
+                return msg.fail("报餐失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return msg.fail("生成二维码失败");
+        }
+
+    }
+
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancelMeal(HttpServletRequest request,String mealType, String factory,String reason){
+        HttpRespMsg msg = new HttpRespMsg();
+//        LocalDateTime now = LocalDateTime.now();
+        UpdateWrapper<MealApplications> eq = new UpdateWrapper<MealApplications>().set("status", "2").set("cancelled_at",LocalDateTime.now()).set("cancel_reason", reason)
+                .eq("user_id", request.getHeader("token")).eq("meal_type_id", mealType).eq("factory_id", factory).eq("application_date", LocalDate.now()).eq("status", "0")
+                .orderByDesc("applied_at").last("limit 1");
+        boolean update = mealApplicationsService.update(eq);
+        if(update){
+            return msg;
+        }else{
+            msg.setCode("error");
+            return msg;
+        }
+    }
+
+
+    @RequestMapping("/getQrCode")
+    public HttpRespMsg getQrCode(HttpServletRequest request,String mealType, String factory){
+        HttpRespMsg msg = new HttpRespMsg();
+        LocalDateTime now = LocalDateTime.now();
+        QueryWrapper<MealApplications> eq = new QueryWrapper<MealApplications>().eq("user_id", request.getHeader("token")).eq("meal_type_id", mealType).eq("factory_id", factory)
+                .eq("application_date", now.toLocalDate()).orderByDesc("applied_at").last("limit 1");
+        MealApplications mealApplications = mealApplicationsService.getOne(eq);
+        if(mealApplications==null){
+            return msg.fail("二维码不存在");
+        }
+        msg.setData(mealApplications);
+      return msg;
+    }
+    /**
+     * 生成二维码并返回Base64编码
+     * @param content 二维码内容
+     * @param width 宽度
+     * @param height 高度
+     * @return Base64编码的二维码图片
+     */
+    private String generateQRCode(String content, int width, int height) throws Exception {
+        //创建二维码配置
+        Map<EncodeHintType, Object> hints = new HashMap<>();
+        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+        hints.put(EncodeHintType.MARGIN, 1);
+
+        //生成二维码矩阵
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
+
+        //转换为BufferedImage
+        BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
+
+        //转换为Base64字符串
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ImageIO.write(image, "PNG", outputStream);
+        byte[] bytes = outputStream.toByteArray();
+
+        return "data:image/png;base64," + Base64.getEncoder().encodeToString(bytes);
+    }
+
+
 
 }
 

+ 14 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MealTypesController.java

@@ -1,6 +1,10 @@
 package com.management.platform.controller;
 
 
+import com.management.platform.service.MealApplicationsService;
+import com.management.platform.service.MealTypesService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -16,6 +20,16 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/meal-types")
 public class MealTypesController {
+    @Autowired
+    private MealTypesService mealTypesService;
+
+    @RequestMapping("/getMeals")
+    public HttpRespMsg getMeals(){
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(mealTypesService.list());
+        msg.setCode("ok");
+        return msg;
+    }
 
 }
 

+ 7 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Factory.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -46,9 +49,13 @@ public class Factory extends Model<Factory> {
     @TableField("is_active")
     private String isActive;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd")
     @TableField("create_at")
     private LocalDateTime createAt;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd")
     @TableField("update_at")
     private LocalDateTime updateAt;
 

+ 2 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/MealApplications.java

@@ -2,8 +2,9 @@ package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;

+ 14 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/MealTypes.java

@@ -1,13 +1,17 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -24,8 +28,8 @@ public class MealTypes extends Model<MealTypes> {
 
     private static final long serialVersionUID=1L;
 
-    @TableId("id")
-    private String id;
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
 
     /**
      * 用餐类型名称
@@ -42,12 +46,16 @@ public class MealTypes extends Model<MealTypes> {
     /**
      * 开始时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd")
     @TableField("start_time")
     private LocalDateTime startTime;
 
     /**
      * 结束时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd")
     @TableField("end_time")
     private LocalDateTime endTime;
 
@@ -57,9 +65,13 @@ public class MealTypes extends Model<MealTypes> {
     @TableField("is_active")
     private String isActive;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd")
     @TableField("create_at")
     private LocalDateTime createAt;
 
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd")
     @TableField("update_at")
     private LocalDateTime updateAt;
 

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -15,7 +15,7 @@ import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
-import com.sun.org.apache.regexp.internal.RE;
+//import com.sun.org.apache.regexp.internal.RE;
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.CellType;

+ 27 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java

@@ -115,6 +115,8 @@ public class TimingTask {
     private PlanExtraInfoService extraInfoService;
     @Resource
     private ApplyFormService applyFormService;
+    @Resource
+    private MealApplicationsService mealApplicationsService;
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
@@ -230,6 +232,31 @@ public class TimingTask {
         }
     }
 
+    /**
+     * 每天凌晨1点执行定时任务,将前一天所有未使用的报餐记录状态设置为3(过期)
+     */
+    @Scheduled(cron = "0 0 1 * * ?")
+    public void updateExpiredMealApplications() {
+        try {
+            // 计算前一天的日期
+            LocalDate yesterday = LocalDate.now().minusDays(1);
+            UpdateWrapper<MealApplications> updateWrapper = new UpdateWrapper<MealApplications>()
+                    .set("status", "3")
+                    .eq("status", 0)
+                    .eq("application_date", yesterday);
+            //更新
+            boolean updated = mealApplicationsService.update(updateWrapper);
+            if (updated) {
+                log.info("成功更新过期报餐记录状态");
+            } else {
+                log.info("没有需要更新的过期报餐记录");
+            }
+        } catch (Exception e) {
+            log.info("更新过期报餐记录状态失败", e);
+            e.printStackTrace();
+        }
+    }
+
     /**
     * @Description:每天凌晨1:20同步前一天的企业微信审核通过的请假数据到车间管家
     * @Param: []

+ 8 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/router/index.js

@@ -103,6 +103,14 @@ const router = new Router({
             keepAlive: false
         }
     },
+      {
+          path: "/mealApplication",
+          component: () => import("@/views/meal/mealApplication"),
+          meta: {
+              title: "报餐",
+              keepAlive: false
+          }
+      },
      {
         path: "/MemberInfo",
         component: () => import("@/views/groupView/info"),

+ 7 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/index/index.vue

@@ -236,6 +236,13 @@ export default {
                     url: '/report',
                     icon: 'balance-list-o'
                 },
+              {
+                name: '报餐',
+                moudelName: '报餐',
+                url: '/mealApplication',
+                icon: 'balance-list-o',
+                fixed: true
+              },
             ]
             console.log(routersList, modelNameList)
             this.routers = routersList.filter(item => item.fixed || modelNameList.includes(item.moudelName));

+ 336 - 0
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/meal/mealApplication.vue

@@ -0,0 +1,336 @@
+<template>
+  <div>
+  <div class="top">
+    <van-nav-bar title="报餐" left-text="返回"  @click-left="back" fixed  placeholder  left-arrow/>
+  </div>
+  <div class="meal-application">
+    <!-- 上方tab页签:晚餐/夜宵 -->
+    <van-tabs v-model:active="mealType" @change="onMealTypeChange">
+      <van-tab v-for="item in meals"
+               :key="item.id"
+               :title="item.name"
+               :name="item.id"></van-tab>
+
+    </van-tabs>
+
+    <!-- 下方tab页签:南厂/北厂 -->
+    <van-tabs v-model:active="factory" @change="onFactoryChange">
+      <van-tab
+          v-for="item in factories"
+          :key="item.id"
+          :title="item.name"
+          :name="item.id"
+      ></van-tab>
+
+    </van-tabs>
+
+    <!-- 二维码展示区域 -->
+    <div class="qrcode-container">
+      <div v-if="qrcodeUrl && qrStatus== 0" class="qrcode-content">
+        <img :src="qrcodeUrl" alt="二维码" class="qrcode-image" />
+        <p class="qrcode-tip">请扫描此二维码</p>
+
+      </div>
+      <div v-else-if="qrcodeUrl && qrStatus== 1" class="qrcode-content">
+        <img :src="qrcodeUrl" alt="二维码" class="qrcode-image" />
+        <p class="qrcode-tip1">此二维码已使用</p>
+      </div>
+      <div v-else-if="qrcodeUrl && qrStatus== 2" class="qrcode-content">
+        <img :src="qrcodeUrl" alt="二维码" class="qrcode-image" />
+        <p class="qrcode-tip1">此二维码已取消</p>
+      </div>
+      <div v-else-if="qrcodeUrl && qrStatus== 3" class="qrcode-content">
+        <img :src="qrcodeUrl" alt="二维码" class="qrcode-image" />
+        <p class="qrcode-tip1">此二维码已过期</p>
+      </div>
+      <div v-else class="no-qrcode">
+        <van-icon name="qr" size="60" color="#c8c9cc" />
+        <p class="no-qrcode-text">暂无二维码</p>
+      </div>
+    </div>
+
+    <!-- 申报按钮 -->
+    <div class="submit-buttons">
+    <div class="submit-button">
+      <van-button
+          type="primary"
+          block
+          @click="submitMealApplication"
+          :loading="submitting"
+      >
+        申报
+      </van-button>
+    </div>
+    <div class="submit-button1">
+      <van-button
+          type="primary"
+          block
+          @click="showCancelDialog = true"
+          :loading="cancelSubmitting"
+      >
+        取消报餐
+      </van-button>
+    </div>
+      <van-dialog
+          v-model:show="showCancelDialog"
+          title="取消报餐"
+          show-cancel-button
+          @confirm="confirmCancel"
+          @cancel="showCancelDialog = false"
+      >
+        <van-field
+            v-model="cancelReason"
+            rows="2"
+            autosize
+            type="textarea"
+            placeholder="请输入取消原因"
+            required
+        />
+      </van-dialog>
+    </div>
+  </div>
+  </div>
+</template>
+
+<script>export default {
+  name: 'MealApplication',
+  data() {
+    return {
+      factory: 1,
+      mealType: 1,
+      meals: [],
+      factories: [],
+      qrcodeUrl: '',      // 二维码图片URL
+      qrStatus: null,
+      submitting: false,   // 提交状态
+      cancelSubmitting: false,
+      showCancelDialog: false,  // 控制取消弹窗显示
+      cancelReason: ''
+      // 提交状态
+    }
+  },
+  mounted() {
+    // 初始化加载二维码
+    this.loadQrCode();
+    this.listFactory();
+    this.listMeal();
+  },
+  methods: {
+    // 餐别切换
+    onMealTypeChange() {
+      this.loadQrCode();
+    },
+
+    // 厂区切换
+    onFactoryChange() {
+      this.loadQrCode();
+    },
+    back() {
+      this.$router.push({
+        path: "/index",
+      })
+    },
+    confirmCancel() {
+      if (!this.cancelReason.trim()) {
+        this.$toast.fail('请输入取消原因');
+        return;
+      }
+      this.consoleMealApplication();
+    },
+
+    listFactory() {
+      this.$axios.get('/factory/getFactories').then(res => {
+        if (res.code === 'ok') {
+          this.factories = res.data.map(item => {
+            return {
+              id: item.id,
+              name: item.name,
+            }
+          })
+          // 设置默认选中第一个厂区
+          if (this.factories.length > 0) {
+            this.factory = this.factories[0].id;
+          }
+        } else {
+          this.factory = 1;
+        }
+      }).catch(err => {
+        console.error('获取厂区列表失败:', err);
+        this.$toast.fail('获取厂区列表失败');
+      });
+    },
+    listMeal() {
+      this.$axios.get('/meal-types/getMeals').then(res => {
+        if (res.code === 'ok') {
+          this.meals = res.data.map(item => {
+            return {
+              id: item.id,
+              name: item.name,
+            }
+          })
+          // 设置默认选中第一个
+          if (this.meals.length > 0) {
+            this.mealType = this.meals[0].id;
+          }
+        } else {
+          this.mealType = 1;
+        }
+      }).catch(err => {
+        console.error('获取餐别列表失败:', err);
+        this.$toast.fail('获取餐别列表失败');
+      });
+    },
+    // 加载二维码
+    loadQrCode() {
+      // 调用后台接口获取二维码
+      this.$axios.post('/meal-applications/getQrCode', {
+        mealType: this.mealType,
+        factory: this.factory
+      }).then(res => {
+        if (res.code === 'ok' && res.data) {
+          this.qrcodeUrl = res.data.qrCode || '';
+          this.qrStatus = res.data.status;
+        } else {
+          this.qrcodeUrl = '';
+        }
+      }).catch(err => {
+        console.error('获取二维码失败:', err);
+        this.qrcodeUrl = '';
+        this.$toast.fail('获取二维码失败');
+      });
+    },
+
+    // 提交申报
+    submitMealApplication() {
+      // if (this.submitting) return;
+
+      // 检查是否有二维码
+      // if (!this.qrcodeUrl) {
+      //   this.$toast.fail('当前无可用二维码');
+      //   return;
+      // }
+
+      this.submitting = true;
+      this.$axios.post('/meal-applications/apply', {
+        mealType: this.mealType,
+        factory: this.factory
+      }).then(res => {
+        if (res.code === 'ok') {
+          this.$toast.success('报餐成功');
+        } else {
+          this.$toast.fail(res.msg || '报餐失败');
+        }
+        this.loadQrCode();
+      }).catch(err => {
+        console.error('报餐失败:', err);
+        this.$toast.fail('报餐失败');
+      }).finally(() => {
+        this.submitting = false;
+      });
+    },
+    consoleMealApplication() {
+      this.cancelSubmitting = true;
+      this.$axios.post('/meal-applications/cancel', {
+        mealType: this.mealType,
+        factory: this.factory,
+        reason: this.cancelReason
+      }).then(res => {
+        if (res.code === 'ok') {
+          this.$toast.success('取消成功');
+          this.showCancelDialog = false;
+        } else {
+          this.$toast.fail(res.msg || '取消失败');
+        }
+        this.loadQrCode();
+      }).catch(err => {
+        console.error('报餐失败:', err);
+        this.$toast.fail('报餐失败');
+      }).finally(() => {
+        this.cancelSubmitting = false;
+      });
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.meal-application {
+  padding: 10px;
+  min-height: 100vh;
+  background-color: #f5f5f5;
+}
+
+.qrcode-container {
+  margin: 20px 10px;
+  padding: 20px;
+  background-color: #fff;
+  border-radius: 8px;
+  min-height: 300px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.qrcode-content {
+  text-align: center;
+}
+
+.qrcode-image {
+  width: 200px;
+  height: 200px;
+  display: block;
+  margin: 0 auto;
+}
+
+.qrcode-tip {
+  margin-top: 10px;
+  font-size: 14px;
+  color: #00b700;
+}
+.qrcode-tip1 {
+  margin-top: 10px;
+  font-size: 14px;
+  color: red;
+}
+
+.no-qrcode {
+  text-align: center;
+  color: #999;
+}
+
+.no-qrcode-text {
+  margin-top: 10px;
+  font-size: 16px;
+}
+
+//.submit-button {
+//  padding: 0 10px;
+//  position: fixed;
+//  bottom: 20px;
+//  left: 0;
+//  right: 0;
+//}
+//.submit-button1 {
+//  padding: 0 10px;
+//  position: fixed;
+//  bottom: 20px;
+//  left: 0;
+//  right: 0;
+//}
+.submit-buttons {
+  padding: 0 10px;
+  position: fixed;
+  bottom: 20px;
+  left: 0;
+  right: 0;
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.submit-button,
+.submit-button1 {
+  width: 100%;
+}
+
+</style>