@Transactional
  public void publish2Item(Long userId, Long activityId, Long itemNumIid, String publishHtml)
      throws TaobaoAccessControlException, TaobaoEnhancedApiException,
          TaobaoSessionExpiredException {
    PosterRecommendPublishItem publishItem =
        posterRecommendPublishItemDAO.selectByUserIdAndActivityIdAndItemNumIidAndStatus(
            userId,
            activityId,
            itemNumIid,
            ImmutableList.of(
                PUBLISH_ITEM_STATUS_WAITING_PUBLISH,
                PUBLISH_ITEM_STATUS_PUBLISHED_FAILED,
                PUBLISH_ITEM_STATUS_UNPUBLISHED_SUCCESSFULLY,
                PUBLISH_ITEM_STATUS_UNPUBLISHED_FAILED));
    if (null == publishItem) {
      return;
    }

    // 更新详情页
    Item item = taobaoApiCache.getItem(userId, itemNumIid);
    // 1 备份
    String backupDesc = item.getDesc();
    // important
    String updatedDesc =
        PublishUtils.addHtml2DetailPage(
            publishItem.getDetailPagePosition(),
            HTML_TAG_RECOMMEND,
            activityId,
            publishHtml,
            backupDesc);
    // 插入详情页备份
    PosterRecommendPublishItemDetailPage posterRecommendPublishItemDetailPage =
        new PosterRecommendPublishItemDetailPage();
    posterRecommendPublishItemDetailPage.setUserId(userId);
    posterRecommendPublishItemDetailPage.setActivityId(activityId);
    posterRecommendPublishItemDetailPage.setItemNumIid(item.getNumIid());
    posterRecommendPublishItemDetailPage.setItemTitle(item.getTitle());
    posterRecommendPublishItemDetailPage.setItemPrice(new BigDecimal(item.getPrice()));
    posterRecommendPublishItemDetailPage.setItemPicUrl(item.getPicUrl());
    posterRecommendPublishItemDetailPage.setBackupDesc(backupDesc);
    posterRecommendPublishItemDetailPage.setDesc(updatedDesc);
    posterRecommendPublishItemDetailPage.setAddTime(appService.getLocalSystemTime().toDate());
    try {
      if (updatedDesc.equals(backupDesc)) {
        ItemUpdateRequest request = new ItemUpdateRequest();
        request.setNumIid(itemNumIid);
        request.setDesc(updatedDesc);
        taobaoApiItemService.updateItem(userId, request);
        taobaoApiCache.invalidItem(itemNumIid);
      }
      posterRecommendPublishItemDetailPage.setStatus(DETAIL_PAGE_STATUS_NORMAL);
      publishSuccessful(userId, activityId, itemNumIid);
    } catch (BaseTaobaoApiException e) {
      publishFailed(userId, activityId, itemNumIid);
      posterRecommendPublishItemDetailPage.setStatus(DETAIL_PAGE_STATUS_PUBLISH_FAILED);
      throw e;
    } finally {
      posterRecommendPublishItemDetailPageDAO.insertSelective(posterRecommendPublishItemDetailPage);
    }
  }