当前位置: 首页 > news >正文

阿里巴巴外贸订单网站做任务赚佣金一单10块

阿里巴巴外贸订单网站,做任务赚佣金一单10块,五金表带厂东莞网站建设,网站设置在设备之间共享怎么开启文章目录 前言一、遇到的问题二、实现过程1.数据库设计2.实体类3.医生添加排班或修改排班方法4.患者预约方法5.患者修改预约6.患者取消预约 前言 该文章从实际需求出发,实现医生设置自身排班与患者预约功能。 一、遇到的问题 1、医生设置的排班表不能有时间上的冲…

文章目录

  • 前言
  • 一、遇到的问题
  • 二、实现过程
    • 1.数据库设计
    • 2.实体类
    • 3.医生添加排班或修改排班方法
    • 4.患者预约方法
    • 5.患者修改预约
    • 6.患者取消预约


前言

该文章从实际需求出发,实现医生设置自身排班与患者预约功能。

一、遇到的问题

1、医生设置的排班表不能有时间上的冲突。
2、医生修改自己的排班时不能与数据库中的数据冲突。
3、如果多为患者同时预约需要使用redis做支撑解决并发问题。

二、实现过程

1.数据库设计

可根据实际需求添加或删除字段

排班数据库 rqri_guidance_time

字段名字段类型长度注释
guidance_time_idint11排班ID
datedate日期
starttimetime开始时间点
endtimetime结束时间点
numint2可预约次数
residueint2剩余可预约次数
doctor_idint11医生ID

预约详情表 rqri_guidance_time_relation

字段名字段类型长度注释
reservation_idint11预约关系ID
guidance_time_idint11排班ID
patient_idint11患者ID
remarkstext病情描述
file_idvarchar256附件ID
reservation_typeint11预约类型ID
doctor_idint11医生ID
replytext回复
reply_files_idvarchar256回复附件ID
statusint1状态ID
isfinishint1是否已完成咨询
finish_timedatetime完成咨询的时间
create_timedatetime创建时间

2.实体类

@Table(name = "rqri_guidance_time")
@Data
public class RqriGuidanceTime implements Serializable {/*** 医生可预约时间id*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@ApiModelProperty(value = "医生可预约时间id", required = false, dataType = "Integer")@Column(name = "guidance_time_id")private Integer guidanceTimeId;/*** 日期*/@ApiModelProperty(value = "日期", required = true, dataType = "Date")@Column(name = "date")@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")private Date date;/*** 开始时间点*/@ApiModelProperty(value = "开始时间点", required = true, dataType = "Date")@Column(name = "starttime")@JsonFormat(locale="zh", timezone="GMT+8", pattern="HH:mm")private Date starttime;/*** 结束时间点*/@ApiModelProperty(value = "结束时间点", required = true, dataType = "Date")@Column(name = "endtime")@JsonFormat(locale="zh", timezone="GMT+8", pattern="HH:mm")private Date endtime;/*** 可预约次数*/@ApiModelProperty(value = "可预约次数", required = true, dataType = "Integer")@Column(name = "num")private Integer num;/*** 剩余可预约次数*/@ApiModelProperty(value = "剩余可预约次数", required = true, dataType = "Integer")@Column(name = "residue")private Integer residue;/*** 医生id*/@ApiModelProperty(value = "医生id", required = true, dataType = "Integer")@Column(name = "doctor_id")private Integer doctorId;
@Table(name = "rqri_guidance_time_relation")
@Data
public class RqriGuidanceTimeRelation implements Serializable {/*** 预约关系id*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@ApiModelProperty(value = "预约关系id", required = false, dataType = "Integer")@Column(name = "reservation_id")private Integer reservationId;/*** 预约时段id*/@ApiModelProperty(value = "预约时段id", required = true, dataType = "Integer")@Column(name = "guidance_time_id")private Integer guidanceTimeId;/*** 患者id*/@ApiModelProperty(value = "患者id", required = true, dataType = "Integer")@Column(name = "patient_id")private Integer patientId;/*** 描述*/@ApiModelProperty(value = "描述", required = false, dataType = "String")@Column(name = "remarks")private String remarks;/*** 附件id*/@ApiModelProperty(value = "附件id", required = false, dataType = "String")@Column(name = "file_id")private String fileId;/*** 预约类型*/@ApiModelProperty(value = "预约类型", required = true, dataType = "Integer")@Column(name = "reservation_type")private Integer reservationType;/*** 医生id*/@ApiModelProperty(value = "医生id", required = false, dataType = "Integer")@Column(name = "doctor_id")private Integer doctorId;/*** 回复*/@ApiModelProperty(value = "回复", required = false, dataType = "String")@Column(name = "reply")private String reply;/*** 回复附件*/@ApiModelProperty(value = "回复附件", required = false, dataType = "String")@Column(name = "reply_files_id")private String replyFilesId;/*** 状态*/@ApiModelProperty(value = "状态", required = false, dataType = "Integer")@Column(name = "work_status")private Integer workStatus;/*** 是否已完成咨询(1是,0否)*/@ApiModelProperty(value = "是否已完成咨询(1是,0否)", required = false, dataType = "Integer")@Column(name = "isfinish")private Integer isfinish;/*** 完成咨询的时间*/@ApiModelProperty(value = "完成咨询的时间", required = false, dataType = "Date")@Column(name = "finish_time")private Date finishTime;/*** 创建时间*/@ApiModelProperty(value = "创建时间", required = false, dataType = "Date")@Column(name = "create_time")private Date createTime;

3.医生添加排班或修改排班方法

    public void addOrUpdateList(List<RqriGuidanceTime> list) {// 查询数据库中已有排班SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("HH:mm");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");ArrayList<String> collect = new ArrayList<>();for (RqriGuidanceTime rqriGuidanceTime : list) {collect.add(simpleDateFormat.format(rqriGuidanceTime.getDate()));}List<String> list_date = collect.stream().distinct().collect(Collectors.toList());List<RqriGuidanceTime> rqriGuidanceTimes = rqriGuidanceTimeMapper.selectByDateList(list_date);// 已有的排班与修改的排班HashMap<String, List<RqriGuidanceTime>> hashMap_update = new HashMap<>();for (String item : list_date) {ArrayList<RqriGuidanceTime> list_update = new ArrayList<>();// 添加已有排班for (int j = 0; j < rqriGuidanceTimes.size(); j++) {if (simpleDateFormat.format(rqriGuidanceTimes.get(j).getDate()).equals(item)) {list_update.add(rqriGuidanceTimes.get(j));}}// 修改已有排班for (RqriGuidanceTime rqriGuidanceTime : list) {if (simpleDateFormat.format(rqriGuidanceTime.getDate()).equals(item) && rqriGuidanceTime.getGuidanceTimeId() != null) {for (int k = 0; k < list_update.size(); k++) {if (rqriGuidanceTime.getGuidanceTimeId().equals(list_update.get(k).getGuidanceTimeId())) {// 是否被预约if (!Objects.equals(list_update.get(k).getNum(), list_update.get(k).getResidue())) {String format = simpleDateFormat1.format(rqriGuidanceTime.getStarttime());String format1 = simpleDateFormat1.format(rqriGuidanceTime.getEndtime());throw new Exception("该时间点已被预约,不可修改!错误时间点:" + item + "," + format + "-" + format1);} else {list_update.set(k, rqriGuidanceTime);}}}}}hashMap_update.put(item, list_update);}// 新增的排班HashMap<String, List<RqriGuidanceTime>> hashMap_add = new HashMap<>();for (String value : list_date) {ArrayList<RqriGuidanceTime> list_add = new ArrayList<>();for (RqriGuidanceTime rqriGuidanceTime : list) {if (simpleDateFormat.format(rqriGuidanceTime.getDate()).equals(value) && rqriGuidanceTime.getGuidanceTimeId() == null) {list_add.add(rqriGuidanceTime);}}hashMap_add.put(value, list_add);}// 校验SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");for (String s : list_date) {List<Integer> list_standard = Arrays.asList(new Integer[2400]);for (int j = 0; j < 2400; j++) {list_standard.set(j, 1); // 1 表示可以选}//  已有的排班与修改的排班List<RqriGuidanceTime> rqriGuidanceTimes_update = hashMap_update.get(s);for (RqriGuidanceTime guidanceTime : rqriGuidanceTimes_update) {String starttime = sdf.format(guidanceTime.getStarttime());String endtime = sdf.format(guidanceTime.getEndtime());int start = Integer.parseInt(starttime.replace(":", ""));int end = Integer.parseInt(endtime.replace(":", ""));if (!(start < end)) {throw new Exception("时间设置错误,错误时间点:" + s + "," + starttime + "-" + endtime);}for (int k = start + 1; k < end; k++) {if (list_standard.get(k) == 0) {throw new Exception("该时间与其他时间点冲突,错误时间点:" + s + "," + starttime + "-" + endtime);} else {list_standard.set(k, 0);}}}// 新增的排班List<RqriGuidanceTime> rqriGuidanceTimes_add = hashMap_add.get(s);for (RqriGuidanceTime rqriGuidanceTime : rqriGuidanceTimes_add) {String starttime = sdf.format(rqriGuidanceTime.getStarttime());String endtime = sdf.format(rqriGuidanceTime.getEndtime());int start = Integer.parseInt(starttime.replace(":", ""));int end = Integer.parseInt(endtime.replace(":", ""));if (!(start < end)) {throw new Exception("时间设置错误,错误时间点:" + s + "," + starttime + "-" + endtime);}for (int k = start + 1; k < end; k++) {if (list_standard.get(k) == 0) {throw new Exception("该时间与其他时间点冲突,错误时间点:" + s + "," + starttime + "-" + endtime);} else {list_standard.set(k, 0);}}}}ArrayList<RqriGuidanceTime> list_update = new ArrayList<>();for (List<RqriGuidanceTime> update : hashMap_update.values()) {list_update.addAll(update);}for (RqriGuidanceTime rqriGuidanceTime : list_update) {rqriGuidanceTime.setResidue(rqriGuidanceTime.getNum());rqriGuidanceTimeMapper.updateByPrimaryKey(rqriGuidanceTime);//插入到redisresidueAddRedis(rqriGuidanceTime.getDate(), rqriGuidanceTime.getGuidanceTimeId().toString(), rqriGuidanceTime.getResidue());}ArrayList<RqriGuidanceTime> list_add = new ArrayList<>();for (List<RqriGuidanceTime> add : hashMap_add.values()) {list_add.addAll(add);}for (RqriGuidanceTime rqriGuidanceTime : list_add) {rqriGuidanceTime.setResidue(rqriGuidanceTime.getNum());}if (list_add.size() > 0) {rqriGuidanceTimeMapper.insertList(list_add);for (RqriGuidanceTime guidanceTime : list_add) {//插入到redisresidueAddRedis(guidanceTime.getDate(), guidanceTime.getGuidanceTimeId().toString(), guidanceTime.getResidue());}}}private static final String RESERVATION = "RESERVATION_";private void residueAddRedis(Date date, String guidanceTimeId, Integer residue) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 将 Date 对象转换为字符串String[] split = dateFormat.format(date).split("-");int year = Integer.parseInt(split[0]);int month = Integer.parseInt(split[1]);int day = Integer.parseInt(split[2]);// 获取当前日期和时间LocalDateTime now = LocalDateTime.now();// 获取过期日期LocalDateTime endDate = LocalDateTime.of(year, month, day, 0, 0, 0, 0);// 计算当前日期和时间到过期日期开始时间的时间差Duration duration = Duration.between(now, endDate);//过期时间秒long seconds = duration.getSeconds();//初始化到redisredisUtils.set(RESERVATION + guidanceTimeId, residue, seconds);}

4.患者预约方法

public void save(RqriGuidanceTimeRelation rqriGuidanceTimeRelation) {boolean b = reservationService.makeReservation(rqriGuidanceTimeRelation.getGuidanceTimeId());if (!b) {throw new BusinessException("该时段已无预约次数");}RqriGuidanceTime rqriGuidanceTime = rqriGuidanceTimelMapper.selectByPrimaryKey(rqriGuidanceTimeRelation.getGuidanceTimeId());Integer residue = rqriGuidanceTime.getResidue();// 可预约次数减1rqriGuidanceTime.setResidue(residue - 1);rqriGuidanceTimelMapper.updateByPrimaryKey(rqriGuidanceTime);Integer guidanceTimeId = rqriGuidanceTime.getGuidanceTimeId();redisUtils.decr(RESERVATION + guidanceTimeId, 1);// 添加预约信息rqriGuidanceTimeRelation.setIsfinish(0);rqriGuidanceTimeRelation.setCreateTime(new Date());rqriGuidanceTimeRelationMapper.insertSelective(rqriGuidanceTimeRelation);}public boolean makeReservation(Integer guidanceTimeId) {String key = RESERVATION + guidanceTimeId.toString();// 获取 Redisson 的分布式锁RLock lock = redissonClient.getLock(RESERVATION_LOCK);try {// 尝试获取锁lock.lock();// 使用 Redis 的原子操作来减少可预约数量Long availableTickets = redisTemplate.opsForValue().decrement(key);if (availableTickets < 0) {// 预约已满,预约失败,需要将可预约数量还原redisTemplate.opsForValue().increment(key);return false;}// 预约成功return true;} finally {// 释放锁lock.unlock();}}

5.患者修改预约

    public void update(Integer reservationId, Integer guidanceTimeId) {//判断新的预约是否有次数可以  有的话 - 1boolean b = reservationService.makeReservation(guidanceTimeId);if (!b) {throw new Exception("该时段已无预约次数");}//查询新的时段是RqriGuidanceTime newGuidanceTime = rqriGuidanceTimelMapper.selectByPrimaryKey(guidanceTimeId);
//        Integer residue = newGuidanceTime.getResidue();
//        if (residue == 0) {
//            throw new Exception("该时段已无预约次数");
//        }//根据预约信息id 查询原预约时段idRqriGuidanceTimeRelation rqriGuidanceTimeRelation = rqriGuidanceTimeRelationMapper.selectByPrimaryKey(reservationId);//根据原预约时段id获取原预约时段数据RqriGuidanceTime old = rqriGuidanceTimelMapper.selectByPrimaryKey(rqriGuidanceTimeRelation.getGuidanceTimeId());//原预约时段次数+ 1redisUtils.incr(RESERVATION + old.getGuidanceTimeId(), 1);old.setResidue(old.getResidue() + 1);//更新原时段rqriGuidanceTimelMapper.updateByPrimaryKey(old);//新预约时段剩余次数-1newGuidanceTime.setResidue(newGuidanceTime.getResidue() - 1);rqriGuidanceTimelMapper.updateByPrimaryKey(newGuidanceTime);//更新预约详情rqriGuidanceTimeRelation.setGuidanceTimeId(guidanceTimeId);rqriGuidanceTimeRelationMapper.updateByPrimaryKey(rqriGuidanceTimeRelation);}

6.患者取消预约

    public void delete(RqriGuidanceTimeRelation rqriGuidanceTimeRelation) throws ParseException {RqriGuidanceTime rqriGuidanceTime = rqriGuidanceTimelMapper.selectByPrimaryKey(rqriGuidanceTimeRelation.getGuidanceTimeId());rqriGuidanceTime.setResidue(rqriGuidanceTime.getResidue() + 1);rqriGuidanceTimelMapper.updateByPrimaryKey(rqriGuidanceTime);rqriGuidanceTimeRelationMapper.delete(rqriGuidanceTimeRelation);redisUtils.incr(RESERVATION + rqriGuidanceTimeRelation.getGuidanceTimeId(), 1);}
http://www.dinnco.com/news/41134.html

相关文章:

  • wap网站模板下载墨子学院seo
  • 企业网站制作开发百度客服电话24小时客服电话
  • 做非法网站的有没有百度科技有限公司
  • 北京公司网站建设小时seo百度关键词点击器
  • wordpress如何访问墨子学院seo
  • 要执行请求的操作_wordpress需要访问您网页服务器的权限站长工具seo综合查询源码
  • 下什么软件做网站网络营销策划师
  • 公司做网站还是做appseo排名计费系统
  • 武汉优化网站百度爱采购官网首页
  • 邯郸做wap网站找谁什么是网店推广
  • 做暖暖网站免费推广工具
  • access做网站服务器深圳做网站seo
  • 福建网站建建设方案sem 推广软件
  • 织梦做网站也是模板吗长沙 建站优化
  • 地方网站需要什么手续盐城seo培训
  • iis建设网站教程seo免费推广软件
  • 重庆高端网站建设价格网站百度手机端排名怎么查询
  • 西安专业做网站的公司哪家好搜索优化网络推广
  • wordpress自豪地seo包括哪些方面
  • 医院门户网站模板站内营销推广方式
  • 营销网站开发规划新手怎么入行sem
  • 网站建设与管理考察报告网站有吗免费的
  • wordpress数据库病毒seo服务 收费
  • 网站项目框架企点官网
  • 网站嵌入播放器管理方面的培训课程
  • 网站正在建设中 代码竞价排名软件
  • 百度上开个网站怎么做深圳华强北最新消息
  • 厦门市建设执业资格管理中心网站2024最火的十大新闻有哪些
  • 做微网站迅宇科技培训班该如何建站
  • 如何看网站做打好坏产品50个关键词